您的位置:首页 > 数据库 > MySQL

MySQL事务详解

2016-12-17 19:01 483 查看
事务: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MySQL 事务