首页 新闻 会员 周边

一个关于mysql的事务隔离级别的问题

0
悬赏园豆:5 [已解决问题] 解决于 2023-08-03 08:37

mysql的默认隔离级别是可重复读,为什么工作场景会换成读已提交呢

*三井寿*的主页 *三井寿* | 初学一级 | 园豆:35
提问于:2023-07-28 22:35
< >
分享
最佳答案
0

MySQL的默认隔离级别是"可重复读"(Repeatable Read),这意味着在同一个事务内,多次读取同一行数据的结果应该是一致的。虽然"可重复读"在很多场景下是合理的,但在某些情况下,可能会选择将隔离级别切换为"读已提交"(Read Committed)。

以下是一些可能的工作场景,考虑将隔离级别切换为"读已提交":

并发性要求高:"可重复读"的隔离级别可能会引起锁定竞争,尤其在高并发环境下。这会导致事务等待时间增加,影响系统的响应性能。"读已提交"级别下,锁的持有时间相对较短,能够更好地支持并发。

读取不稳定数据:在一些场景中,允许读取尚未提交的数据可能是有意义的。例如,一个订单系统可能允许用户在下单后立即查看订单状态,而无需等待整个事务提交。这种情况下,"读已提交"级别会更合适。

脏读不是问题:在一些业务场景中,脏读(Dirty Read)即读取到了尚未提交的数据也不会造成严重后果。例如,某些实时分析或统计系统可能会选择"读已提交"级别来获得即时的数据。

事务并不需要长时间运行:"读已提交"级别会降低事务的锁定范围,但也增加了幻读(Phantom Read)的可能性。如果事务执行时间不长,幻读对业务影响较小,则可以选择"读已提交"级别。

值得注意的是,将隔离级别从"可重复读"切换到"读已提交"可以提高并发性能,但也会引入一些潜在的问题,例如脏读、不可重复读和幻读。在选择隔离级别时,需要根据业务需求和数据的一致性要求进行权衡,确保选择的隔离级别能够满足业务需求并保障数据的正确性。

收获园豆:5
Technologyforgood | 大侠五级 |园豆:5992 | 2023-07-30 21:26
其他回答(1)
0

\MySQL的默认隔离级别是可重复读(REPEATABLE READ),这意味着在同一个事务中,查询将看不到其他事务中已提交的更改,这可以提供一致性和稳定性。

但是,在某些工作场景下,将隔离级别切换为读已提交(READ COMMITTED)可能是有意义的。读已提交隔离级别允许一个事务在另一个事务提交后立即看到其所做的更改,而不需要等待整个事务完成。

以下是一些可能的工作场景,可以考虑将隔离级别切换为读已提交:

  1. 并发写入频繁:如果你的应用程序中有大量的并发写入操作,可重复读隔离级别可能会导致锁竞争,从而影响性能。在这种情况下,使用读已提交隔离级别可以减少锁竞争,提高并发性能。

  2. 需要实时数据:如果你的应用程序需要实时的、最新的数据,而不关心其他事务的未提交更改,那么读已提交隔离级别可能更适合。这样,你可以立即看到其他事务已经提交的更改,而不需要等待整个事务完成。

需要注意的是,切换隔离级别可能会引入一些其他问题,例如脏读、不可重复读和幻读。因此,在切换隔离级别之前,你需要仔细评估你的应用程序的需求和风险,并确保你的代码和业务逻辑能够正确处理这些问题。

你可以使用以下语句将MySQL的隔离级别切换为读已提交:

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
lanedm | 园豆:2381 (老鸟四级) | 2023-07-30 21:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册