ACID,事务应该具有的四个属性
Atomicity
(原子性),一个事务是一个不可分割的工作单位,事务中包括的各个操作要么都做,要么都不做Consistency
(一致性),事务必须是使数据库从一个一致性状态转变到另一个一致性状态。一致性与原子性是密切相关的Isolation
(隔离型),一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间是不能相互干扰的Durability
(持久性),一个事务一旦提交,他对数据库中的数据的改变就是永久性的。接下来的其他操作或故障不应该对其有任何影响
事务的并发问题
脏读
:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据就是脏数据不可重复读
:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据做了更新操作并提交,导致事务A多次读取同一条数据的结果不一致幻读
:事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。
事务的隔离级别
-
未提交读
(read uncommited)脏读- 事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻读”和“不可重复读取”。
-
已提交读
(read comited)不可重复读- 大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了脏读,但是不能避免幻读和不可重复读。
-
可重复读
(repeatable read)- 保证了一个事务不会修改已经由另一个事务读取但未提交的数据。避免脏读和不可重复读的问题,但是不能避免幻读。
-
串行化
(serializable)- 最严格的级别,事务串行执行,资源消耗最大