事务定义:事务是由一组SQL语句组成的逻辑处理单元。
事务的属性
- 原子性(Atomicity) :当前事务的操作要么同时成功,要么同时失败。原子性由 undo log 日志来实现。
- 一致性(Consistent) :使用事务的最终的目的,由其他 3 个特性及业务代码正确逻辑来实现。
- 隔离性(Isolation) :在事务并发执行时,多个事务的操作不能互相干扰。隔离性由 MySQL 的各种锁及 MVCC 机制来实现。
- 持久性(Durable) :提交事务之后,事务对数据库的改变就应该是永久性的。永久性由 redo log 日志来实现。
并发事务带来的问题
- 更新丢失或脏写:事务 A 的更新覆盖了事务 B 的更新。例如事务 A 读取一条数据,其中价格这个字段的值为100,在 java 程序中手动加了 50,即把 150 这个值更新回了数据库,但是在读取数据之后,更新之前,事务 B 已经把这个字段的值更新为 200,事务 A 更新的之后就覆盖了事务 B 的更新。
- 脏读:事务 A 读到了事务 B 还未提交的数据。
- 不可重复读:在同一个事务中,不同时刻,相同查询语句查询结果不一致。
- 幻读:事务 A 读取到了事务 B 提交的新增数据。例如在可重复读隔离级别下,事务 A 先进行查询,事务 B 这时新增了一条数据,这时事务 A 可以执行更新这条数据的操作,更新之后再次查询就可以查询到这条数据了。
事务隔离级别
隔离级别 | 脏读(Dirty Read) | 不可重复读(NonRepeatable Read) | 幻读(Phantom Read) |
---|---|---|---|
读未提交(Read uncommitted) | 可能 | 可能 | 可能 |
读已提交(Read committed) | 不可能 | 可能 | 可能 |
可重复读(Repeatable read) | 不可能 | 不可能 | 可能 |
可串行化(Serializable) | 不可能 | 不可能 | 不可能 |