公众号merlinsea
事务的隔离级别
事务具有原子性,一致性,隔离性,持久性四大特性。其中隔离性是指mysql如果同时开启多个事务,不同的事务之间相互影响的程度却是有不同的等级的。
事务隔离级别:
read uncommitted(读取未提交数据):即便是事务没有commit,但是其他连接仍然能读到未提交的数据,这是所有隔离级别中最低 的⼀种。
read committed(可以读取其他事务提交的数据):当前会话只能读取到其他事务提交的数据,未提交的数据读不到。
repeatable read(可重读)---MySQL默认的隔离级别:当前会话可以重复读,就是每次读取的结果集都相同,⽽不管其他事务有没有 提交。
serializable(串⾏化):其他会话对该表的写操作将被挂起。可以看到,这是隔离级别中最严格的,但是这样做势必对性能造成影响。
mysql中设置事务隔离级别语句
set global transaction isolation level read uncommitted;
read uncommitted隔离级别
read committed隔离级别
repeatable read隔离级别
由于mysql中设置的隔离级别的不同,导致的问题有脏读,幻读,不可重复读。
- 脏读,幻读,不可重复读
问题简介
根据数据库的不同的隔离级别,会导致事务产生不同的现象,脏读,幻读,不可重复读就分别用于描述这些现象。
脏读:在读未提交的隔离级别下,事务2可能读取到事务1还没有提交的数据,但事务1最终可能是rollback回滚数据,导致事务2读取到的是事务1的脏数据。脏读只会出现在【读未提交】的隔离级别下。
幻读:事务2中先后读取某一个范围的数据时,事务1中途可能向这个范围中插入了一条数据,导致事务2先后两次读取这个范围的数据记录数量不一致的情况出现,即出现所谓的幻影行。幻读会出现在【读未提交】,【读已提交】,【可重复读】的隔离级别中。
不可重复读:事务2中先后读取某一条记录时,事务1中途可能修改了这条记录,导致事务2中先后读取这条记录出现不一致的情况。不可重复读出现在【读未提交】和【读已提交】的隔离级别中。
为什么repeatable read的隔离级别下仍存在幻读问题?
repeatable read的隔离级别的幻读只出现在更新操作中,在读取操作的时候是不会出现幻读的。因为mysql的可重复读的机制是在开启事务的时候就会生成一个快照表,所有的读取操作都是基于这个快照表来操作,但是更新操作是基于原表进行操作的,因此会导致在可重复读读隔离级别下更新操作可能出现幻读。
关于leetcode算法训练营:
加我微信号私聊参加训练营~
本人用c++刷了800道左右的算法,java语言刷了600道左右的算法题,并对这些题做了详细的个人总结。本科期间系统学习了数据结构与算法课程,同时考研过程中写完了率辉主编的《2020年数据结构高分笔记》和《数据结构1000题》,看完的视频包括《mooc浙大数据结构国家精品课程》和《王道考研408数据结构课程》,《王道2019年算法题讲解视频》,最终以初试专业第三名进入了北理工软件工程专业。熟悉并掌握常见的数据结构,比如链表、数组、树、图、队列、堆栈等等,精通数据结构教材中的所有算法,比如常见的遍历算法、动态规划,递归,回溯,剪枝,并查集,最短路径,拓扑排序等等,所以快加入训练营吧,我们一起进步
奔跑的小梁,公众号:梁霖编程工具库算法训练营,快来参加