加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL事务隔离性与隔离机制

发布时间:2023-07-03 10:28:24 所属栏目:MySql教程 来源:
导读:当在数据库上同时执行多个事务(可以理解为多任务、并发场景)时,可能会发生脏读、不可重复读和幻读。

1、四种隔离级别
为了解决这些问题,MySQL 引入了“隔离级别”的概念。

隔离级别越高,效率就
当在数据库上同时执行多个事务(可以理解为多任务、并发场景)时,可能会发生脏读、不可重复读和幻读。

1、四种隔离级别
为了解决这些问题,MySQL 引入了“隔离级别”的概念。

隔离级别越高,效率就越低,很多时候,我们必须在两者之间找到平衡。SQL标准的事务隔离级别包括:读(取)未提交(read uncommitted)、读(取)已提交(read committed)、可重复读取(repeatable read)和串行化(serializable )。

读未提交(RU,Read Uncommitted),它可以读取事务的中间过程。它违反了ACID特性,并且存在脏读取的问题。因此基本上不被使用,可以被忽略。

读已提交(RC,Read Committed),这意味着,如果已经提交了其他事务,我们可以看到这也是最常用的级别。然而,由于一些历史原因,RC可能在生产环境中使用不多。

可重复读(RR,Repeatable Read)是目前使用最广泛的级别。它的特点是间隙锁定,这仍然是默认级别。在这个级别,死锁、低并发和其他问题经常发生。

串行化(serializable ),不是多版本实现,而是单版本实现,因为它的所有实现都是通过锁实现的。基本上不被使用,可以被忽略。

2、并发事务引起的问题

不可重复读:事务A多次读取相同的数据。事务B在事务A多次读取的过程中更新并提交数据,导致事务A多次捕获同一数据时结果不一致。

一个事务读取到其他事务已提交的数据导致前后两次读取数据不一样的情况

幻读:A查出来数据,此时B提交,A再次查同一数据时结果不一致。一个事务前后两次读取的数据不一致,是因为其他事务插入数据导致的事务并发情况

不可重复读和幻读很容易混淆,不可重复读侧重于修改,而幻读侧重于添加或删除。要解决不可重复读取的问题,只需要锁,符合条件的行,而要解决幻读问题需要锁表。

3、查看mysql事务隔离级别
SELECT @@transaction_isolation; -- 查看mysql事务隔离级别
SELECT @@tx_isolation;          -- 查看mysql事务隔离级别

4、不可重复读
一个事务读取到其他事务已提交的数据导致前后两次读取数据不一样的情况。
select * from fork_business_detail where id= 4;
BEGIN; -- 开启事务
select * from fork_business_detail where id= 4;
UPDATE fork_business_detail set SUB_ODR_ID=123004 where id= 4;
COMMIT;
select * from fork_business_detail where id= 5;

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章