首页 > 代码库 > MySQL事务详解

MySQL事务详解


事务:Transaction

    多个sql语句,要么同时都执行,要么同时都不执行

    事务就是一组原子性的(select)查询语句,也即将多个查询当作一个独立的工作单元


ACID测试:能够满足ACID测试就表示其支持事务,或兼容事务

A:Atomicity,原子性,都执行或者都不执行
C:Consistency,一致性,从一个一致性状态转到另外一个一致性状态
I:Isolaction,隔离性。一个事务的所有修改操作在提交前对其他事务是不可见的
D: Durability, 持久性,一旦事务得到提交,其所做的修改会永久有效



MySQL事务的四个隔离级别

技术分享


安全性越高,并发性越低(接近串行)



隔离级别:

   READ UNCOMMITTED(读未提交),

          脏读(读别人尚未提交的数据),

          不可重复读(两次读同一个数据,得到的结果可能不一样,别人可能正在修改)

          幻读

          (数据安全性最低,并发性最高)

   READ COMMITTED(读提交)

   REPEATABLE READ (可重读) --> mysql 解决了脏读

   SERIALIZABLE(可串行化)强制事务的串行执行避免了幻读;性能极低


注:MyISAM存储引擎不支持事务


启动事务
   mysql > start transaction
事务提交
   mysql > commit
//所有执行都生效


启动事务
   mysql > start transaction
事务回滚
   mysql > rollback
   mysql > SAVEPOINT identifier 控制回滚的位置
   mysql > ROLLBACK [WORK] TO [SAVEPOINT] identifier  回滚到指定位置
      //放弃刚刚的某些操作



E.G
  mysql> start transaction;
  mysql> select * from tests;


技术分享

 

  mysql> delete from tests where sid=6;
  mysql> savepoint a; --> 设置保存点名称
  mysql> delete from tests where sid=4;
  mysql> savepoint b;
  mysql> delete from tests where sid=9;
  mysql> savepoint c;
  mysql> select * from tests;


技术分享

 

  mysql> rollback to b;
  mysql> select * from tests;


技术分享

  mysql> rollback to a;
  mysql> select * from tests


技术分享


  mysql> rollback; --> 全部恢复
  mysql> select * from tests;


技术分享



如何没有显式启动事务,每个语句都会当作一个默认的事务,其执行完成会被自动提交

mysql> show variables like ‘autocommit‘;


技术分享


mysql > set session autocommit = 0;  --> 手动关闭自动提交功能
注意 关闭自动提交,请记得手动提交事务


查看mysql的事务隔离级别

show global  variables like ‘%iso%‘
select @@global.tx_isolation


技术分享


mysql> set global tx_isolation=‘READ-UNCOMMITTED‘;
//修改级别 READ-UNCOMMITTED


测试MySQL的四个隔离级别及其重现问题(两个终端中测试)


读未提交测试

技术分享


读提交测试

技术分享



可重读测试

技术分享


技术分享



串行化测试

技术分享



建议:对事物要求不特别严格的场景下,可以使用读提交

修改要想永久有效;修改配置文件



MVCC:多版本并发控制

    每个事务启动时,InnoDB会为每个启动的事务提供一个当下时刻的快照

    为实现此功能,InnoDB会为每个表提供两隐藏的字段,一个用于保存行的创建时间,

    一个用于保存行的失效时间


    旨在两个隔离级别下有效:read committed和repeatable read



本文出自 “似水流年” 博客,请务必保留此出处http://sixijie123.blog.51cto.com/11880770/1883625

MySQL事务详解