数据库事务概念

一、数据库事务的概念

 数据库事务由ACID四个特性构成。

    1、A(Atomic):即原子性。是指在一个事务中的所有操作要么全部成功,要么全部失败。

    2.   C(Consistent):即一致性。假设我们10个人,每人有一个账号,里面有钱,可以转来转去,这组成了一个小型的数据系统,那么什么叫数据一致性?就是不管怎么转账,这10个人的账号金额总数不变——满足这一条件,就叫数据一致,不满足,就叫数据不一致。一致性是对数据可见性的约束,保证在一个事务中的多次操作的数据中间状态对其他事务不可见的。因为这些中间状态,是一个过渡状态,与事务的开始状态和事务的结束状态是不一致的。
     举个例子,张三给李四转账100元。事务要做的是从张三账户上减掉100元,李四账户上加上100元。一致性的含义是其他事务要么看到张三还没有给李四转账的状态,要么张三已经成功转账给李四的状态,而对于张三少了100元,李四还没加上100元这个中间状态是不可见的。
原子性和一致性的区别和联系:
      在数据库实现的场景中,一致性可以分为数据库外部的一致性和数据库内部的一致性。前者由外部应用的编码来保证,即某个应用在执行转帐的数据库操作时,必须在同一个事务内部调用对帐户A和帐户B的操作。如果在这个层次出现错误,这不是数据库本身能够解决的,也不属于我们需要讨论的范围。后者由数据库来保证,即在同一个事务内部的一组操作必须全部执行成功(或者全部失败)。这就是事务处理的原子性。

但是,原子性并不能完全保证一致性。在多个事务并行进行的情况下,即使保证了每一个事务的原子性,仍然可能导致数据不一致的结果。例如,事务1需要将100元转入帐号A:先读取帐号A的值,然后在这个值上加上100。但是,在这两个操作之间,另一个事务2修改了帐号A的值,为它增加了100元。那么最后的结果应该是A增加了200元。但事实上,

事务1最终完成后,帐号A只增加了100元,因为事务2的修改结果被事务1覆盖掉了。为了保证并发情况下的一致性,引入了隔离性,即保证每一个事务能够看到的数据总是一致的,就好象其它并发事务并不存在一样。

3.I(Isolation):即隔离性 。多个事务之间就像是串行执行一样,不相互影响;

4.D (Durability):即持久性。成功提交的事务,数据是持久保留,保证不会丢失

二、数据库的隔离级别

在上述ACID特性中,隔离性指的是不同事务在提交的时候,最终呈现出来的效果是串行的,换句话说,既是不同事务,按照提交的先后顺序执行,再换句话说,对于事务本身来说,它所感知的数据库,应该只有它自己在操作。那么最简单的方法,我们按照定义来实现数据库事务的隔离性即可,很明显这在同时并发有多个事务要执行的环境下是没有执行效率的,一个事务的执行,必然会阻塞其他事务的执行。所以SQL的标准制定者对此作出妥协,提出隔离性的四个等级,其中最高级隔离等级才是串行执行。但在没有到达串行执行等级的情况下,事务又是并发执行的,总是会存在某些问题的。隔离性的四个等级从低到高如下:

1.读未提交(Read uncommitted):这是最低级别的隔离。在该隔离级别下,如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。由此带来的问题是一个事务读取到了另一个事务未提交的数据操作结果。这叫脏读。

2.读已提交(Read committed,Oracle、PostgreSQL、SQL Server默认模式)。该隔离级别在读未提交隔离级别上增加了一条,即读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。该隔离级别能够避免脏读,但是却可能出现不可重复读。例如事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。 这叫不可重复读(non-repeatable read)。

3.可重复读(Repeatable read,MySQL默认模式):该隔离级别能够防止不可重复读的问题。即在一次事物中读取的值都相同。实现原理是读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。这能够避免了不可重复读取和脏读,但是有时可能出现幻读。如果一个事务成功执行并且添加了新数据(例如添加一行),这些数据对其他正在执行的事务是可见的。但是如果事务成功修改了一条数据,修改结果对正在运行的事务不可见。举个例子,如果事务A运行”SELECT count(1) from TABLE_X” ,然后事务B在 TABLE_X 加入一条新数据并提交,当事务A再运行一次 count(1)结果不会是一样的。 

4.串行化(Serializable,SQLite默认模式):最高级别的隔离。两个同时发生的事务100%隔离,事务只能一个接着一个地执行。它是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读。


你可能感兴趣的:(数据库事务概念)