隔离级别(默认是RR,可重复读)
读未提交(read uncommitted) 允许读取未提交的数据。
读已提交(read committed) 只允许读取已提交数据,但不要求可重复读,比如在事务两次读取一个数据项周期间,另一个事务更新了该数据项并提交。
可重复读(repeatable read) 只允许读取已提交的数据,而且在一个事务两次读取一个数据项期间,其他事务不得更新该数据。但该事务不要求与其他事务可串行化。比如,在两次统计查询中,另一个事务可以插入一些记录,当这些记录中有符合查询条件的,就会产生幻读。还是会出现幻读问题。
可串行化(serializable) 看起来事务就好像是串行执行的一样。一个事务结束后,另一个事务才开始执行。
隔离性依次提高:
read uncommitted →read committed→repeatable read→serializable
所有隔离级别都不允许脏写(dirty write)
即如果有一个数据项已被另一个尚未提交或中止的事务写入,则该事务不能对该数据项执行写操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TDMCBpt2-1619856631855)(隔离级别以及对应的并发问题day0303/image-20210501134232582.png)]
查看当前隔离级别
select @@session.transaction_isolation;
设置当前隔离级别为读未提交
set session transaction isolation level read uncommitted;
如何演示并发的问题
1,脏写: 左边update 右边也update
2,脏读:左边update(不要提交),右边进行select
3,不可重复读:左边先select,右边update,左边select
4,幻读:左边select 右边insert 左边select