事务:事务就是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体进行提交或撤销,这些操作要么都成功,要么都失败。
事务的四大特性(ACID):
- 原子性:事务是不可分割的最小操作单位,要么全部成功、要么全部失败。
- 一致性:事务完成时,所有的数据必须保持一致。
- 隔离性:保证事务不受外部的并发操作的影响
- 持久性:事务一旦提交或回滚,它对数据库中数据的改变是永久的。
并发事务带来的问题:
- 脏读:一个事务读取到另外一个事务没有提交的数据。
- 不可重复读:一个事务先后读取同一条数据,但两次读取的数据不同。
- 幻读:一个事务在读取某一条数据时,查询不到该数据,但在插入时提示该数据已经存在。
事务的隔离等级:
- read_uncommitted:读未提交,最低的隔离级别,会发生脏读、不可重复读、幻读
- read_committed:读已提交,允许当前事务读取别的已经提交的事务。可以阻止脏读、会发生不可重复读、幻读
- repeatable_read:可重复读。对同一数据的多次读取结果保证一致,除非是事务本身对数据进行修改,可以阻止脏读、不可重复读,会发生幻读。
- serializable:最高的隔离级别,完全遵循ACID特性。所有的事务依次逐个执行,这样就不会到发生问题,但效率低下。