事务是数据库的执行单位。事务具有ACID属性。原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
- 原子性:即事务中的一组操作,要么全执行,要么全部不执行
- 一致性:事务前数据是一致,事务后数据也是保持一致的
- 隔离性:多个并发事务执行时,要和事务串行执行的结果是一样的
- 持久性:数据库数据是持久化的,在数据库关闭或故障是可以恢复的
### 数据库隔离级别:
- 读未提交(read uncommitted):
写事务阻止其他写事务,不阻止其他读事务。会造成*脏读*:在一个写事务未提交之前读数据,读到的是脏数据。解决:read committed
- 读已提交(read committed):
写事务阻止其他读写事务,读事务不阻止其他事务。会造成*不可重复读*:在一个写事务之前读一次数据,和在写事务提交之后再次读取的值不一致。解决:repeatable read
- 可重复读(repeatable read):
读事务阻止其他写事务。会造成*幻读*:因为读事务只能阻止update和delete操作,不能阻止insert操作。所以会导致在insert前后读取不一致的数据量。解决:Serializable
- 串行化(Serializable):事务一个一个执行。
目前大部分的数据库默认隔离级别是:read committed,MySQL的默认隔离级别就是Repeatable read。
用户可以根据应用的具体事务性来确定不同的隔离级别。
选择不同的隔离级别要在事务安全和数据库读写性能之间平衡。考虑应用的实际情况,选择适当的事务级别。