MySQL 中有四种事务隔离级别,它们分别是:
- read uncommited:未提交读,读到未提交数据;
- read committed:读已提交,也叫不可重复读,两次读取到的数据不一致;
- repetable read:可重复读;
- serializable:串行化,读写数据都会锁住整张表,数据操作不会出错,但并发性能极低,开发中很少用到。
MySQL 默认使用
REPEATABLE-READ
的事务隔离级别。
MySQL提供了四种事务隔离级别,分别是:
- 读未提交(Read Uncommitted):最低的隔离级别,事务中的修改操作可以被其他事务读取,即一个事务可以读取到另一个事务尚未提交的数据。这种隔离级别可能导致脏读(Dirty Read)问题,即读取到未提交的数据。
- 读已提交(Read Committed):在该隔离级别下,事务只能读取到已经提交的数据。这样可以避免脏读问题,但可能引发不可重复读(Non-repeatable Read)问题,即在同一个事务中,多次读取同一行数据时,可能会得到不同的结果。
- 可重复读(Repeatable Read):在该隔离级别下,事务中的查询操作将始终读取到事务开始时的一致快照。这意味着在同一个事务中多次读取同一行数据时,会得到相同的结果。可重复读级别可以避免不可重复读问题,但可能引发幻读(Phantom Read)问题。
- 串行化(Serializable):最高的隔离级别,事务串行执行,确保了最高的数据一致性。在该隔离级别下,事务之间完全隔离,避免了脏读、不可重复读和幻读问题。但串行化级别的并发性最低,可能导致性能下降。
可以通过以下方式设置事务隔离级别:
- 在会话级别设置隔离级别:使用
SET SESSION TRANSACTION ISOLATION LEVEL <隔离级别>
语句来设置当前会话的隔离级别。 - 在事务级别设置隔离级别:使用
SET TRANSACTION ISOLATION LEVEL <隔离级别>
语句在事务开始之前设置隔离级别。
默认的隔离级别是可重复读(Repeatable Read)。选择适当的隔离级别需要根据应用程序的需求和对数据一致性的要求进行权衡。较低的隔离级别通常具有更好的性能和并发性,但可能导致数据不一致的问题。较高的隔离级别提供了更严格的数据一致性,但可能影响并发性能。