事务: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
原文地址:http://sixijie123.blog.51cto.com/11880770/1883625