事务实现在存储引擎层,事务的隔离级别分为:读未提交(read uncommitted)、读已提交(read committed)、可重复读(repeatable read)、串行化(serializable)。
- mysql 默认的事务隔离级别为 可重复读(RR) 事务隔离级别越高,事务并发处理的效率越低
读未提交
- 未提交读的意思就是比如原先name的值是小刚,然后有一个事务B
update table set name = '小明' where id = 1
,它还没提交事务。同时事务A也起了,有一个select语句select name from table where id = 1
,在这个隔离级别下获取到的name的值是小明而不是小刚。那万一事务B回滚了,实际数据库中的名字还是小刚,事务A却返回了一个小明,这就称之为脏读。
读已提交
- 按照上面那个例子,在已提交读的情况下,事务A的select name 的结果是小刚,而不是小明,因为在这个隔离级别下,一个事务只能读到另一个事务修改的已经提交了事务的数据。但是有个现象,还是拿上面的例子说。如果事务B 在这时候隐式提交了时候,然后事务A的select name结果就是小明了,这都没问题,但是事务A还没结束,这时候事务B又
update table set name = '小红' where id = 1
并且隐式提交了。然后事务A又执行了一次select name from table where id = 1
结果就返回了小红。这种现象叫不可重复读。
可重复读
- 可重复读就是一个事务只能读到另一个事务修改的已提交了事务的数据,但是第一次读取的数据,即使别的事务修改的这个值,这个事务再读取这条数据的时候还是和第一次获取的一样,不会随着别的事务的修改而改变。这和已提交读的区别就在于,它重复读取的值是不变的。所以取了个贴切的名字叫可重复读。按照这个隔离级别下那上面的例子就是:
串行化
- 上面三个隔离级别对同一条记录的读和写都可以并发进行,但是串行化格式下就只能进行读-读并发。只要有一个事务操作一条记录的写,那么其他要访问这条记录的事务都得等着。
转摘自 https://baijiahao.baidu.com/s?id=1629344395894429251&wfr=spider&for=pc