参考:http://www.zsythink.net/archives/1233/
Mysql Innodb 事务隔离级别
事务符合ACID要求,满足原子性,一致性,持久性,隔离性(通过锁机制满足)
事务隔离级别从低到高有4种
1.Read-uncommittted 读未提交
2.Read-committed 读提交
3.Repeatable-read 可重复读 (mysql 默认配置)
4.Serializable 串行化
Read-uncommittted 读未提交:
特性:同时begin开启两个客户端两个事务,第1个客户端update,未commit,第2个客户端select可以马上看到修改,这种现象叫“脏读”,并发性能最强,但隔离性和安全性最差。
Read-committed 读提交:
特性:也会出现“不可重读”,“幻读”的问题,但是并发能力比可重读更强。
Repeatable-read 可重复读:
特性:同时begin开启两个客户端两个事务,第1个客户端update,未commit,第2个客户端select查询的结果是修改之前的,之后commit结束后才可查询到第1个客户端修改后的值
原因:innodb采用了“一致性非锁定读”机制,提高了并发性,什么是“一致性非锁定读”?如果在当前施加排他锁同时需要读行数据,不会等待行上锁释放。
幻读:同时开启两个客户端两个事务begin,第1个客户端insert 1条数据,commit,第2个客户端select查询的结果是修改之前的,当第2个客户端update set全表再select时,会看到第1个客户端刚刚insert的数据,相同sql select多次,莫名其妙多1条或减少1条是“幻读“,莫名被修改现象叫“不可重读”。
Serializable 串行化:
特性:同时begin开启两个客户端两个事务,第1个客户端insert,,第2个客户端select会超时,只有当第1个客户端commit时,第2个客户端才会有结果,所以不会有幻读问题。
缺点:隔离级别过于严格,数据库失去并发能力,很少使用。
网友评论