事务隔离级别分为几类:如何查询当前数据库的事务隔离级别?常用的数据库隔离级别是什么? select @@tx_isolation; REPEATABLE-READ
如何设置事务的隔离级别?
描述:当客户端a 和 客户端 b 同时设置了事务隔离级别 为 read-uncommitted 。当客户端 b开启事务 进行了数据更新,但是遇到了异常 进行 rollback .此时更新失败。同事a客户端 进行了数据读取,进行了更新 操作,虽然数据进行数据操作时,没有发生本质的区别,但是如果是逻辑代码写 那就出现了问题。
描述:当a b 两个客户端都设置了 read-committed 事务隔离级别 b客户端,进行开启事务,更新操作后,a客户端继续数据查询 没有获取到b更新的数据。解决了脏读问题。当b事务进行了提交,但是a客户端获取数据,发现数据发生了变化,这就出现了 不可重复读问题。
描述:客户端a,b都设置事务隔离级别 repeatable-read模式,当a开启事务,同时b进行数据更新,a查询的数据没有获取到b数据的变化,当b事务进行提交后,a查询的数据 没有获取到b数据的变化,因为a事务一直没有提交,解决了脏读和不可重复读问题
在客户端A,接着执行update account set balance = balance - 50 where id = 1,balance没有变成400-50=350, lilei的balance值用的是步骤2中的350来算的,所以是300,数据的一致性倒是没有被破坏。 可重复读的隔离级别下使用了MVCC(multi-version concurrency control) 多版本并发控制机制, select操作不会更新版本号,是快照读(历史版本);insert、update和delete会更新版本号,是当前读(当前版本)
描述:在客户端b 中新增一条数据,查询一个id为 4的数据,在客户端a事务中 查询无法查询到数据 但是如果在事务a中对id 为4的数据进行更新,可以更新成功,同事在次查询可以获取到最新的数据结果。
描述:客户端 a,b a进行数据id查询,同时 b进行id数据进行更新,发现一只处于被锁状态,当a事务提交了,b也就更新成功了。同事如果id是范围内的,也被锁了
描述:在事务隔离级别为 repeatable-red下进行事务操作,当b事务没有提交,同时更新的id为 8 到18直接 ,由于表的间隙设置如下三个 ,都有介入,所有将3到20全部锁住了,包括20 间隙锁是在可重复读隔离级别下才会生效。目前间隙 (3,10)(10,20) (20,正无穷)
无索引行锁会升级为表锁(RR级别会升级为表锁RC级别不会升级为表锁)
锁定某一行还可以用lock in share mode(共享锁) 和for update(排它锁), 例如:select * from test_innodb_lock where a = 2 for update; 这样其他session只能读这行数据,修改则会被阻塞,直到锁定行的session提交
InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为表锁
如何查询行锁分析?