【关系型数据库】事务特性及事务隔离级别总结
事务特性 ACID:
(1)原子性(Atomicity)
一个事务由一系列操作组成,要么全部生效,要么全不生效,不存在部分生效的情况
(2)一致性(Consistency)
事务执行完成后,需要保证数据一致性,满足业务规则,比如余额不能是负的
(3)隔离性(Isolation)
多个事务对同一数据的操作是隔离开的,不会相互干扰
(4)持久性(Durability)
事务执行成功后,将永久生效,即使数据库故障或者宕机,也不会丢失已提交的数据
另外,Redis支持事务,但是只能保证隔离性和一致性,没有原子性,也不会回滚
事务隔离级别
以下为事务隔离级别及可能导致的问题,对应事务隔离级别以下为该事务隔离级别下事务并发可能导致的问题(例如:读已提交可能导致不可重复读和幻读问题):
事务隔离级别-读未提交(READ UNCOMMITED):允许事务读取到其他事务未提交的数据修改
脏读:读到未提交事务的数据,是最差的事务隔离级别,可以说没有隔离。比如:事务1读到事务2操作中但未提交的数据,事务2回滚了,事务1读到了错误的数据。
事务隔离级别-读已提交(READ COMMITED):事务只能读取到其他事务提交后对数据的修改,即数据写入加锁,读取不加锁
不可重复读:同一事务多次查询,查询到的内容不同,即同一事务多次查询间隔中有其他事务修改了数据
事务隔离级别-可重复读(REPEATABLE READ):同一事务多次读取结果相同,在事务A读取数据后不允许其他事务修改,直到事务A执行结束,即数据读取加锁,MySQL InnoDB引擎默认的事务隔离级别
幻读:同一事务多次查询,查询到的数据条数不同,即同一事务多次查询间隔有其他事务新增了数据
事务隔离级别-串行化(SERIALIZABLE):事务串行,且锁住的不只是被操作的数据,因为需要防止幻读,事务A读取时,不允许事务B的曾,删,改操作,读加读锁(共享锁),写加写锁(独占锁)