MySQL中的事务
事务,就是对一系列的数据库操作进行统一提交或回滚操作,要么全部成功,要么全部失败,不允许部分成功部分失败的情况
事务的特性
ACID
-
A:原子性,一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态
-
C:一致性,在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
-
I:隔离性,数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务分为四种隔离级别
-
D:持久性,事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
事务的并发操作
- 事务的并发操作会导致三个问题:
- 脏读,事务A读取了事务B修改的数据,然后事务B进行回滚操作,那么A读取到的数据就是脏数据
- 不可重复读,事务A多次读取同一数据,在这个过程中事务B修改了该数据,并进行提交,导致事务A多次读取的同一数据结果不一致
- 幻读,事务A修改表中所有数据的某一个字段的值,在这个过程中,事务B新增了一条没有被修改过字段的数据,当事务A完成之后发现还有数据没有被修改,即幻读
事务的四种隔离级别
- READ UNCOMMITED:事务中的修改即使没有被提交,对其他事务也是可见的,会导致脏读、不可重复读和幻读
- READ COMMITED:事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的,会导致不可重复读和幻读
- REPEATABLE READ:一个事务按相同的查询条件读取以前检索过的数据,其他事务插入了满足其查询条件的新数据。产生幻行。导致幻读(MySQL默认的事务隔离级别)
- SERIALIZABLE:强制事务串行执行