事务的特性

一、事务:事务就是一可控的方式对数据资源访问的一组操作。为了保证事务操作前后,数据资源所承载的系统状态始终处于“正确”的状态,

  事务本身持有4个限定属性,即原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability),这也是常说的事务的ACID属性。

  1.原子性:原子性要求事务所包含的所有操作是一个不可分割的整体,这些操作,这些操作要么全部操作成功,只要有一个失败,就全部失败。

  2.一致性:一致性要求事务所包含的操作不能违反数据资源的一致性检查,数据资源在事务执行之前处于摸个数据一致性状态,那么,事务执行之后也依然需要保持数据间一致性状态。例如:银行转账,A用户想B用户转账500元。那么A用户账户减少500元,B用户账户多500元。如果事务操作结束,整个数据状态不是这个样子,那么系统就处于不一致状态。

  3.隔离性:事务的隔离性主要规定了各个事务之间相互影响程度。隔离性概念主要面向数据库并发访问,并兼顾影响事务的一致性。当两个事务或者更多事务同事访问同意数据资源的时候,不同的隔离级别决定了各个事务对该数据资源访问的不同行为。事务的隔离级别主要有四种,从弱到强分别为Read Uncommitted、Read Committed、Repeatable Read和Serializable。

      Read Uncommitted :它是最低的隔离级别。Read Uncommitted最直接的效果就是,一个事物可以读取另一个事务没有提交的更新结果。Read Uncommitted是以较低的隔离度来寻求较高的性能,其本身无法避免以下几个问题。

                脏读(Dirty Read):如果一个事务对数据进行更新,但是事务还没有提交,另一个事务就可以“看到”该事务灭有提交的更新结果。这样造成的问题就是,如果第一个事务回滚,那么第二个事务再次之前所“看到”的数据就是一笔脏据。

                不可重复读(Non-Repeatable Read):不可重复读是指同一个事务在整个事务过程中对同一笔数据进行读取,每次读取结果都不同。如果事务1在事务2的更新操作之前读取一次数据,在事务2的更新操作之后在读取同一笔数据,两次结果是不同的。所以Read Uncommitted也无法避免不可重复读取的问题。

                幻读(Phantom Read):幻读是指同一个查询在整个事务过程中多次执行后,查询所得的结果是不一样的。幻读针对的是多笔记录。在Read Uncommitted隔离级别下,不管事务2的插入操作是否提交,事务1在插入操作之前和之后执   行相同的查询,取得的结果是不同的,所以,Read Uncommitted是无法避免幻读问题。

      Read Committed:Read Committed是大多数数据库的默认隔离级别。在该隔离级别下,一个事务的更新操作结果只有在该事务提交之后,另一个事务才可能读取到同一笔数据更新后的结果。所以,Read Committed可以避免Read Uncommitted 隔离级别下   存在脏读问题,但是无法避免不可重复读和幻读问题。

                     Repeatable Read:Repeatable Read隔离级别可以保证在整个事务中,对同一笔数据的读取结果是相同的,不管其他事务是否同时在对同一笔数据进行更新操作,也不管其他事务对同一笔数据的更新提交与否。Repeatable Read隔离级别避免了脏读和不可   重复读问题,但是无法避免幻读。

      Serializable:它是最严格的隔离级别,所有事务操作都必须一次按顺序执行,可以避免其他隔离级别遇到的所有问题。,是最安全的隔离级别,但同时也是性能最差的隔离级别。所有事务依次按顺序执行,并发度下降,吞吐量上不去。

    对于数据库来说,通常都有一个默认的隔离级别,大数据情况下都是Read Committed。而且,并非所有的数据都支持这四种隔离级别,比如Oracle只支持Read Committed和Serializable。如果指定的隔离级别当前数据不支持,那么数据库会采用默认的隔离级别代替指定的隔离级别。Spring、JDBC等数据访问方式,都允许我们为事务指定隔离级别,但是最终事务是否以指定的隔离级别执行,则由底层数据库来决定。

    隔离程度与并发性、一致性之间的关系:

      

  4.持久性:事务的持久性是指,一旦整个事务操作成功提交,对数据所做的变更将被记录并不可逆转。

      

posted @ 2017-07-17 22:30  离不开天空的云  阅读(235)  评论(0编辑  收藏  举报