mysql事务隔离级别

事务隔离级别分为几类:如何查询当前数据库的事务隔离级别?常用的数据库隔离级别是什么? 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的行锁是针对索引加的锁,不是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为表锁

如何查询行锁分析?

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值