zoukankan      html  css  js  c++  java
  • mysql的事务

    什么是事务

      事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行。作为一个关系型数据库,MySQL支持事务.
      一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成
      事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同
    

    事务的四大特征

    • 原子性
      定义:原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做;如果事务中一个sql语句执行失败,则已执行的语句也必须回滚,数据库退回到事务前的状态。
    • 持久性
      定义:持久性是指事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
    • 隔离性
      定义:与原子性、持久性侧重于研究事务本身不同,隔离性研究的是不同事务之间的相互影响。隔离性是指,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。严格的隔离性,对应了事务隔离级别中的Serializable (可串行化),但实际应用中出于性能方面的考虑很少会使用可串行化。
    • 一致性
      定义:在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。

    事务的一些术语:

    • 开启事务:Start Transaction
    • 事务结束:End Transaction
    • 提交事务:Commit Transaction
    • 回滚事务:Rollback Transaction
    • 开启标志: 任何一条DML语句(insert、update、delete)执行,标志事务的开启
    • 结束标志: 提交:成功的结束,将所有的DML语句操作历史记录和底层硬盘数据来一次同步
      回滚:失败的结束,将所有的DML语句操作历史记录全部清空

    并发事务处理带来的问题

      相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从而可以支持更多的用户。但并发事务处理也会带来一些问题,主要包括以下几种情况。
      1.脏读(Dirty Reads):一个事务可以读取另一个尚未提交事务的修改数据。
      2.不可重复读(Non-Repeatable Reads):同一个事务中,多次查询某个数据,却得到不同的结果。
      3.幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据。
      不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
    

    隔离性的四大隔离级别:

    只有InnoDB支持事务,所以这里说的事务隔离级别是指InnoDB下的事务隔离级别

    • 读未提交:read uncommitted

    事物A和事物B,事物A未提交的数据,事物B可以读取到
    这里读取到的数据叫做“脏数据”
    这种隔离级别最低,这种级别一般是在理论上存在,数据库隔离级别一般都高于该级别

    • 读已提交:read committed

    事物A和事物B,事物A提交的数据,事物B才能读取到
    这种隔离级别高于读未提交
    换句话说,对方事物提交之后的数据,我当前事物才能读取到
    这种级别可以避免“脏数据”
    这种隔离级别会导致“不可重复读取”
    Oracle默认隔离级别

    • 可重复读:repeatable read

    事务A和事务B,事务A提交之后的数据,事务B读取不到
    事务B是可重复读取数据
    这种隔离级别高于读已提交
    换句话说,对方提交之后的数据,我还是读取不到
    这种隔离级别可以避免“不可重复读取”,达到可重复读取
    比如1点和2点读到数据是同一个
    MySQL默认级别
    虽然可以达到可重复读取,但是会导致“幻像读”

    • 串行化:serializable

    事务A和事务B,事务A在操作数据库时,事务B只能排队等待
    这种隔离级别很少使用,吞吐量太低,用户体验差
    这种级别可以避免“幻像读”,每一次读取的都是数据库中真实存在数据,事务A与事务B串行,而不并发

    设置事务隔离级别

    • 第一种方式

    可以在my.ini文件中使用transaction-isolation选项来设置服务器的缺省事务隔离级别。
    [mysqld]
    transaction-isolation = READ-COMMITTE(READ-UNCOMMITTED、REPEATABLE-READ、SERIALIZABLE)

    • 第二种方式:

    通过命令动态设置隔离级别
    隔离级别也可以在运行的服务器中动态设置,应使用SET TRANSACTION ISOLATION LEVEL语句。
    其语法模式为:SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
    例如:SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    隔离级别可以划分为会话级、全局级
    会话级:
    SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
    全局级:
    SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

  • 相关阅读:
    Apache Phoenix系列 | 从入门到精通(转载)
    Phoenix 简单介绍
    ES 调优查询亿级数据毫秒级返回!怎么做到的?--文件系统缓存
    Linux 文件系统缓存 -针对不同数据库有不同作用
    Hive 调优
    clickhouse 中文论坛
    从0到N建立高性价比的大数据平台(转载)
    ClickHouse 分布式高可用集群搭建(转载)
    Hive 模式设计
    Oracle 分区表中本地索引和全局索引的适用场景
  • 原文地址:https://www.cnblogs.com/qixc/p/12952329.html
Copyright © 2011-2022 走看看