MySQL中的事务隔离级别有哪些?

MySQL支持4种事务隔离级别:

  1. 读未提交(READ UNCOMMITTED):最低级别,事务可以读取其他未提交事务的变更。会导致脏读、不可重复读和幻读问题。
  2. 读已提交(READ COMMITTED):默认级别,事务只能读取其他已提交事务的变更。避免脏读,但可能导致不可重复读和幻读。
  3. 可重复读(REPEATABLE READ):事务在读取行时加共享锁,确保其他事务不会再更新或删除此行,避免不可重复读,但可能出现幻读。
  4. 可串行化(SERIALIZABLE):最严格级别,通过加排他锁阻止其他事务对同一行的读与写,完全避免上述问题,但性能最差。

设置事务隔离级别:

sql
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;  

例1(读未提交):

sql
# 事务1 
START TRANSACTION;
SELECT * FROM products WHERE id = 1;   # 读取id=1行

# 事务2
START TRANSACTION; 
UPDATE products SET price = 20 WHERE id = 1;  # 更新id=1行 
COMMIT;  

# 事务1继续 
SELECT * FROM products WHERE id = 1;  # 读取id=1行,得到更新后的price=20
COMMIT;  
例2(可重复读):
sql
# 事务1 
START TRANSACTION; 
SELECT * FROM products WHERE id IN (1, 2);  # 读取id=1和2行

# 事务2
START TRANSACTION;   
DELETE FROM products WHERE id = 1;   # 删除id=1行
COMMIT;

# 事务1继续 
SELECT * FROM products WHERE id IN (1, 2);  # 仍读取id=1行,不受事务2影响 
COMMIT;

总结:
更严格的隔离级别可以更好地隔离事务,避免各种问题,但会降低并发性能。选择合适的隔离级别需要在一致性和性能之间权衡。