说到mysql你就会想到关系型数据库的ACID四大特性,今天我想详细说说mysql事物的隔离性。那么数据库事物为什么要有隔离性?四种隔离级别有什么作用?
1. 多个事务环境下存在的问题
在并发环境下,多个数据库事务同时对资源进行操作会产生一些问题,你可能已经耳闻过脏读、不可重复读、幻读。下面举例说明他们是怎么产生的。
脏读,场景1:事物2修改一条数据,未提交,此时事物1获取该条数据,然后事物2回滚。
可重复读,场景2
幻读, 场景3
上面三种场景带来的问题分别是脏读,可重复读,和幻读。
脏读:是指一个事务中访问到了另外一个事务未提交的数据。例如事务2的未提交的数据被事务1读走,如果事务2失败回滚,会导致事务1所读取的的数据是错误的。
可重复读:是指在一个事务内根据同一个条件对行记录进行多次查询,但是搜出来的结果却不一致。比如事务1中两处读取id=1的值。在第一读的时候,name是小明,然后事务2就把name的数据改成 小红,事务1再读一次,结果就发现,name竟然就变成小红了,造成事务1数据两次读取数据不一致。
幻读:指同一个事务内多次查询返回的结果集不一样(比如增加了或者减少了行记录)。
2. 四种事务的隔离级别
为了解决以上问题数据库提出了四种隔离级别:
(1)read uncommited:是最低的事务隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。
(2)read commited:保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。
(3)repeatable read:这种事务隔离级别可以防止脏读,不可重复读。但是可能会出现幻象读。它除了保证一个事务不能被另外一个事务读取未提交的数据之外还避免了以下情况产生(不可重复读)。
(4)serializable:这是花费最高代价但最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读之外,还避免了幻象读