【mysql】事物与隔离级别
事物
事务(Transaction)是并发控制的基本单位。所谓的事务呢,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
事务具有四大特性,通常称为ACID特性:
- 原子性(Atomicity):事务要么完全执行,要么完全不执行。
- 一致性(Consistency):事务执行后,数据库从一个一致性状态转移到另一个一致性状态。
- 隔离性(Isolation):事务的执行不受其他事务的影响。
- 持久性(Durability):事务一旦提交,其结果将永久保存在数据库中。
隔离级别
MySQL支持四个标准的隔离级别,从低到高分别是:
- 读未提交(Read Uncommitted):允许一个事务读取另一个事务未提交的数据。
- 读已提交(Read Committed):保证一个事务不会读取到另一个未提交事务的数据。
- 可重复读(Repeatable Read):确保在事务执行期间查询相同记录的结果始终一致。
- 串行化(Serializable):最高的隔离级别,通过强制事务串行执行来避免并发问题。
隔离级别定义了多个事务之间的相互影响程度,数据库往往是多个线程并发执行多个事务,采用不同的隔离级别会有不同的结果。如果不考虑事务的隔离性,可能会发生几种问题
- 脏读:一个事务读到了另一个未提交事务修改过的数据,就意味着发生了脏读现象。
- 不可重复读:一个事务修改了另一个未提交事务读取的数据,就意味着发生了不可重复读现象。
- 幻读:一个事务先根据某些查询条件查询出一些记录,在该事务未提交时,另一个事务写入了一些符合那些收缩条件的记录(这里指INSERT,DELETE,UPDATE 操作),就以为着发生了幻读现象
不同隔离级别对应可能出现的情况:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMMITTED | ☑️ | ☑️ | ☑️ |
READ COMMITTED | ❌ | ☑️ | ☑️ |
REPEATABLE READ | ❌ | ❌ | ☑️ |
SERIALIZABLE | ❌ | ❌ | ❌ |