示例MySQL事务隔离级别以及脏读、幻读、不可重复读

说白了,MySQL的事务隔离级别就是为了解决多个事务并发时可能出现的脏读、不可重复读、幻读等问题。
其实很简单。
四种隔离级别分别是未提交读、已提交读、可重复读和序列化。

我们先来说说最重要的事情。
当一个事务未提交时,它所做的更改可以被读未提交事务级别的其他事务看到。
我们去年跑的项目就遇到了脏读的情况。
会话A增加了余额但没有提交。
会话 B 读取增加的值。
结果A回滚了,B读到的数据是脏数据。

还有一点,在只读事务层面,只有一个事务发送出去之后,它所做的改变才会被其他事务看到。
这样可以避免脏读数,但可能会出现不可重复读数和幻读。
例如,会话 A 读取数据后,会话 B 进行更改并发送它们。
如果会话A再次读取数据,它会看到不同的数据。

还有另一个重要的细节。
在可重复读级别,事务执行过程中看到的数据始终与事务发起时看到的数据一致。
虽然这可以避免脏读数和不可重复读数,但幻读仍然可能发生。

等一下,那是另一回事。
在序列化层面,对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。
这意味着当发生读/写锁冲突时,后面访问的事务必须等待前一个事务完成后才能继续执行。
在此级别上,不会发生脏读、不可重复读和幻读。

说实话,很多人都没有注意到这一点。
MySQL的InnoDB存储引擎采用Next-KeyLock算法来避免可重复读级别的幻读,一定程度上提高了事务隔离性。

我认为值得一试。
在具体项目中根据自己的需求选择合适的隔离级别,可以有效避免并发事务中可能出现的问题。
但也应注意,不同的绝缘等级会产生不同的性能影响,应根据实际情况进行权衡。

MySQL四种隔离级别是什么?分别怎么实现的?

MySQL 有四个不同的级别:未压缩读取;宣读誓言;可反复阅读;和序列号。
让我们详细讨论如何完成这四个操作。

1 .读未提交 对方可以认为这是随意的,无论是否进行了更改。
定义:一个事务可以看到另一个未经授权的事务更改的数据。
实现方式是这样的:不加锁,直接观看,不用关心版本。
这往往会导致脏读等问题;这意味着其他人将看到未保存的更改并最终发现它们已被回滚。
这在实践中很少使用。

2 读已提交 这更好。
完成后我会告诉你。
含义:只能查看已保存交易更改的数据。
实现此目的的方法是使用版本控制或提交日志来确保保存您看到的所有内容。
不过,它避免了脏读。
可能会遇到反复出现无法阅读的文本;因为同一个事务被读取两次,中间还存储了其他变化,所以结果是不同的。
这很常见。

3 可重复读取(可重复读取) 它是不要更改在同一事务中查看的数据。
含义:在同一笔交易中查看的数据不会改变,除非您自己更改。
实现方法是:MySQL使用多版本并发控制(MVCC),在每个事务开始时固定数据的快照;然后根据该快照查看数据。
这避免了幻读;也就是说,结果集不同,因为同一笔交易被检查了两次,中间还存储了其他数据。
MySQL 使用间隙锁来防止这种情况。
这个用得很多。

4 可以进行序列号。
这是最强的一次来。
定义:强制事务一个接一个地执行。
实现此目的的方法是添加各种锁,以确保一个事务在另一个事务开始之前完成。
读起来令人心寒;完全避免非重复读和幻读;然而,合作却很差。
MySQL 使用两阶段锁定协议来做到这一点,在开始时申请锁,在结束时释放锁。
一般使用它是因为它太慢。

一般情况下:
随心所欲地阅读:随心所欲地阅读。
没有钥匙 肮脏的易读。

读取并提交:修改后读取,避免脏读使用版本控制无法重复读取它。

重复读取:使用MVCC和间隙锁在同一事务中查看的数据保持不变,以避免脏读和幻读。

连载:一篇一篇地做;锁定 完全避免相关问题;然而,它很慢。

如何选择取决于您想要并发性还是数据一致性。
这取决于实际的使用情况。

mysql隔离级别

上周我测试了MySQL的事务隔离级别。

有四种类型。

序列化(SERIALIZABLE)。
所有这一切都是孤立的、一个接一个地执行的。

可重复读取(REPEatableread)。
这不会被视为一个序列。
但从外面看不出任何变化。

已定价。
这比重复阅读更糟糕。

阅读不完整。
这是最糟糕的部分,您可能会看到未提交的数据。

我在 2 02 3 年尝试使用此开发。

最常使用哪个级别?我朋友说这要看业务需求。

忘记它吧。
由你决定。