事务:Transactionmysql
多个sql语句,要么同时都执行,要么同时都不执行sql
事务就是一组原子性的(select)查询语句,也即将多个查询看成一个独立的工做单元安全
ACID测试:可以知足ACID测试就表示其支持事务,或兼容事务bash
A:Atomicity,原子性,都执行或者都不执行 C:Consistency,一致性,从一个一致性状态转到另一个一致性状态 I:Isolaction,隔离性。一个事务的全部修改操做在提交前对其余事务是不可见的 D: Durability, 持久性,一旦事务获得提交,其所作的修改会永久有效
MySQL事务的四个隔离级别session
安全性越高,并发性越低(接近串行)并发
隔离级别:ide
READ UNCOMMITTED(读未提交),性能
脏读(读别人还没有提交的数据),测试
不可重复读(两次读同一个数据,获得的结果可能不同,别人可能正在修改)spa
幻读
(数据安全性最低,并发性最高)
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