MySQL的四种事务隔离级别
事务名称 | A事务 | B事务 |
---|---|---|
读未提交 | 修改未提交事务 | 生效 |
不可重复读 | 修改提交事务 | 生效 |
可重复读 | 修改提交事务 | 未生效 |
串行化 | B有查询则A不能修改 | ------ |
- 事务的基本要素(ACID)----- 原子性、一致性、隔离性、持久性
- 事务的并发问题 ----- 脏读、不可重复读、幻读
- 事务隔离级别 -----读未提交(read-uncommitted)、不可重复读(read-committed)、可重复读(repeatable-read)、串行化(serializable)
--查看当前回话事务级别
select @@tx_isolation
--设置当前回话事务级别
set session transaction isolation level serializable
--开始事务
start transaction
--提交事务
COMMIT
--回滚事务
ROLLBACK
注意:
-
不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
-
可重复读的隔离级别下使用了MVCC机制,select操作不会更新版本号,是快照读(历史版本);insert、update和delete会更新版本号,是当前读(当前版本)。
-
不同事务对表和行的影响
- 事务隔离级别为读提交时,写数据只会锁住相应的行
- 事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引) 的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。
- 事务隔离级别为串行化时,读写数据都会锁住整张表
- 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大