ACID 事务特性
原子性:要么都成功,要么都失败。失败不影响数据库。
一致性:应用层系统从一种正确的状态,在事务成功后到另一种正确的状态。数据库状态一致,应用逻辑一致。如转账前后两个账户总金额一致。
隔离性:多个事务同时执行,相互之间不影响。
持久性:事务提交对数据库的影响是永久的。
隔离级别:
读未提交(Read Uncommitted):写的时候禁止其他事务写
读已提交(Read Committed):写的时候禁止其他事务读写。
可重复读取(Repeatable Read):读的时候禁止其他事务写,写的时候其他事务禁止读写。
序列化(Serializable):事务只能一个接一个地执行。
异常情况
一)脏读:就是A事务在读取数据时,B事务对同一个数据修改了,但B未提交,A再读取时,读到了B修改后的数据,但是B事务提交失败,回滚,A后读到的数据就是B修改后的脏数据,此为脏读。
二)不可重复读:就是A事务读取数据,B事务改了这个数据,也提交成功了,A再读取就是B修改后的数据,再也不能重复读到最开始的那个数据值了,此为不可重复读
三)幻读:可重复读就是A事务读取数据,B事务改了这个数据(update),也提交成功了,A再读这个数据,SQL机制强行让A仍然读之前读到的数据值,这就是可重复读,这种机制对Insert操作无效,A事务在可重复读的机制下,读取数据,B事务insert一条数据,提交成功,A再读这个数据,会显示B插入的数据,此为幻读。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
默认隔离级别
大多数的数据库默认隔离级别为 Read Commited,比如 SqlServer、Oracle
少数数据库默认隔离级别为:Repeatable Read 比如: MySQL InnoDB