事务特性ACID
参考:http://blog.csdn.net/chosen0ne/article/details/10036775
事务的概念
是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。一个逻辑单元要成为事务,必须要有满足ACID特性。
A. Atomicity原子性
事务的是不可再分的最小单位。整个事务所有操作要么都执行,要么都不执行。
C. Consistency 一致性
个人解释:一个事务包含增删改查,这些操作所以都顺利执行,则事务提交。要么全部失败,也即其中如果有一个异常,则事务滚回,事务中所有操作撤销。比如关联的两个表,修改了一个,另外一个也必定要修改,他们在一个事务中,不能只修改一个表而不去修改另一个表,只能要么都修改,要么都不修改。也即从一个一致性状态到另外一个一致性状态。
(底下是CD的解释)
一致性是指事务使得系统从一个一致的状态转换到另一个一致状态。事务的一致性决定了一个系统设计和实现的复杂度。事务可以不同程度的一致性:
强一致性:读操作可以立即读到提交的更新操作。
弱一致性:提交的更新操作,不一定立即会被读操作读到,此种情况会存在一个不一致窗口,指的是读操作可以读到最新值的一段时间。
最终一致性:是弱一致性的特例。事务更新一份数据,最终一致性保证在没有其他事务更新同样的值的话,最终所有的事务都会读到之前事务更新的最新值。如果没有错误发生,不一致窗口的大小依赖于:通信延迟,系统负载等。
其他一致性变体还有:
单调一致性:如果一个进程已经读到一个值,那么后续不会读到更早的值。
会话一致性:保证客户端和服务器交互的会话过程中,读操作可以读到更新操作后的最新值。
I. Isolation 隔离性
一个事务的执行不受其他事务影响,并发执行的隔离性!
在数据库无隔离性的情况下会出现数据的脏读、不可重复读取、幻读等问题。只有解决以上问题,才能保证隔离性。
隔离性强弱如下:
- Read Committed:只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题。
- Repeated Read:在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。可以解决脏读、不可重复读。
-
Serialization:事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。
-
脏读:事务A修改了一个数据,但未提交,事务B读到了事务A未提交的更新结果,如果事务A提交失败,事务B读到的就是脏数据。
- 不可重复读:在同一个事务中,对于同一份数据读取到的结果不一致。比如,事务B在事务A提交前读到的结果,和提交后读到的结果可能不同。不可重复读出现的原因就是事务并发修改记录,要避免这种情况,最简单的方法就是对要修改的记录加锁,这回导致锁竞争加剧,影响性能。另一种方法是通过MVCC可以在无锁的情况下,避免不可重复读。
- 幻读:在同一个事务中,同一个查询多次返回的结果不一致。事务A新增了一条记录,事务B在事务A提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录。幻读是由于并发事务增加记录导致的,这个不能像不可重复读通过记录加锁解决,因为对于新增的记录根本无法加锁。需要将事务串行化,才能避免幻读。
持久性
事务提交后,对系统的影响是持久的,对数据库的更改会永久的保存,哪怕是断电。

浙公网安备 33010602011771号