MySQL事务

事务

  • 事务定义

    • 由一个或者多个SQL语句组成的一个独立的执行单元,其中每个SQL语句相互依赖
    • 事务的SQL语句要么全部执行成功,如果某条SQL语句执行失败或者产生错误,整个单元将回滚,所有数据回到事务执行开始之前
    • 查看当前事务隔离级别:SELECT @@TX_ISOLATION;
    • 设置数据库系统的全局隔离级别:set global transaction isolation level read committed
  • 事务特性(ACID)

    • 原子性(Atomicity)
      一个事务必须被视为一个不可分割的最小工资单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中一部分操作
    • 一致性(Consistency)
      事务必须使数据库从一个一致性状态变换到另外一个一致性状态
    • 隔离性(Isolation)
      独立性,一个事务的执行不能被其他的事务干扰,即一个事务内部的操作及使用的数据对并发的其他的事务是隔离的,并发执行的各个事务之间不能相互干扰。
    • 持久性(Durability)
      一个事务一旦被提交,则会永久改变数据库的数据,接下来来的其他操作和数据库故障不应该对其有任何的影响
  • 事务的创建

    • 隐式事务
      • 事务没有明显的开启和结束标记,比如 insert,update,delete
      • SHOW VARIABLES LIKE ‘autocommit’ ---- ON----自动提交开启
    • 显示事务
      • 事务具有明显的开启和结束标志(必须先禁用自动提交功能)
      • set autocommit=0;
    SET autocommit;
    START transaction;  #可选
    # 编写SQL
    SQL1;
    SQL2;
    # 提交
    COMMIT;
    # 回滚
    ROLLBACK;
    # 节点
    SAVEPOINT 节点名;
    # 回滚到节点
    ROLLBACK TO 节点名;
    
  • 事务的隔离机制

    • 脏读
      对于两个事务,TI,T2;T1读取了已经被T2更新但还没有被提交的数据,若T2回滚,T1读取的内容就是临时且无效的。
      事务的修改,即使没有提交,对其他事务也是可见的。事务可以读取未提交的数据。

    • 不可重复读
      对于两个事务,T1,T2;T1读取了一个数据,然后T2更新了该数据,T1再次读取同一个字段,值就不同了;在事务T1中多次读取该字段数据不一样;

    • 幻读
      T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行,之后,如果再次读取同一个表的数据,就会多出几行数据

  • 事务的隔离级别

    • 读未提交(READ UNCOMMITED)
      事务的修改,即使没有提交,对其他事务也是可见的,允许事务读取未提交的数据。脏读,不可重复读,幻读的问题都会出现,一般实际应用中很少出现。
    • 读已提交(READ COMMITED)
      一个事务开始时,只能“看见”已经提交的事务所做的修改;一个事务从开始到提交之前,所做的任何修改对其他事务都是不可见的;只允许事务读取已经被其他事务提交的变更。可以避免脏读,但不可重复读,幻读的问题还会出现
    • 可重复读(REPEATABLE READ)
      确保事务可以多次从一个字段读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,多次读取的字段数据是一样的;可以避免脏读,不可重复读,但幻读的问题任然存在
    • 串行化(SERIALIZABLE)
      确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事物对该表进行插入,更新,删除造成,所有并发问题都可以避免,但是性能低下
    • Oracle
      读已提交,串行化;默认:读 已提交
    • MySQL
      四种都支持;默认:可重复读
  • 隔离级别与锁的关系

    • 读未提交级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突

    • 读已提交级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;

    • 可重复读级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。

    • 串行化 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。

你可能感兴趣的:(MySQL,mysql,sql)