解释: Read uncommitted(未提交读),就是说一个线程修改了某一个数据之后,还没有提交之前,就被其他线程读到修改后的数据,这样一来肯定会产生问题
Read committed(提交读),(大多数数据库系统的默认隔离级别)就是说A线程修改了结果以后,必须提交之后才能被其他线程读到新结果,在他还没有提交之前,数据还是旧的数据。但是这样有一个纰漏,就是A线程在访问修改该数据的时候,其他线程也有可能随时读取到数据,这样的话,其他线程可能拿到的是旧数据,一旦A线程提交修改以后,其他线程那边的数据立刻刷新(valotile关键字的作用),所以还是可能会出现一些问题
参考链接: https://blog.csdn.net/qq_40241957/article/details/83653379
Repeatable read(可重复读):
Serializable(可串行化):由于它大量的加锁,所以性能低下,虽然可以避免很多数据读取问题。
数据库的隔离级别详解参考链接:https://blog.csdn.net/qq_40241957/article/details/83653379
解释:
①为什么read-uncommitted由于是读到未提交的,所以不存在版本的问题?
答: 因为读未提交可以读到其他事务未提交的更新,每次拿去的都是最新的数据 ,所以版本号永远都是最新的
②为什么read-uncommitted隔离级别不能使用mvcc?
答: 因为读未提交会读取到别人可能回滚的更新数据,所以数据不对,所以不建议使用mvcc
③为什么REPEATABLE READ则是读取事务开始时的行数据版本?
答: 因为可重复度保证了每一行的记录的一致性(也就是说事务处理的基本单位是“行”),所以当事务开始时,读取事务开始的行数据版本即可
小疑问: 为什么只有read-commited读取的是行数据的最新版本?为什么因为read-uncommited是读未提交的,所以不存在版本问题呢?上述图中最后一个括号里面的(注:事务A,事务B。。。。。。。)是什么意思呢?
答: read-commited是通过“锁行”的方式来防止其他事务干扰
解释: 什么是意向锁概念?
例如,当读取表里的页面时,在请求页共享锁(S锁)之前,事务在表级请求共享意向锁。这样可以防止其他事务随后在表上获取排他锁(X锁),修改整个表格。意向锁可以提高性能,因为数据库引擎仅在表级检查意向锁,确定事务是否能安全地获取该表上的锁,而不需要检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。(意向锁是更粗粒度的锁,相当于在最外层,其他事务访问数据之前最先检测到的就是意向锁)
5.死锁的解决办法?
产生死锁后需要由一个事务进行回滚,一般是选择回滚undo量最小的事务,一般是表锁引起死锁,因为其占用大量锁资源。