【十九】数据库-事务的特性及隔离级别

目录

一、事务的四大特性

⑴ 原子性(Atomicity)

⑵ 一致性(Consistency)

⑶ 隔离性(Isolation)

     ① Serializable (串行化):

  ② Repeatable read (可重复读):

  ③ Read committed (读已提交):

  ④ Read uncommitted (读未提交):

⑷ 持久性(Durability)

(5)事务的四大特性(ACID)的本质


一、事务的四大特性

事务(Transaction)是并发控制的基本单位。所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。

数据库系统必须维护事务的以下特性(简称ACID):

  原子性(Atomicity)

  一致性(Consistency)

  隔离性(Isolation)

  持久性(Durability)

⑴ 原子性(Atomicity)

  一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

⑵ 一致性(Consistency)

  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

  拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

⑶ 隔离性(Isolation)

        指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。关于事务的隔离性数据库提供了多种隔离级别。事务的隔离级别如下:

     ① Serializable (串行化):

           可避免脏读、不可重复读、幻读的发生。先介绍一下这几个概念:

                   1)脏读(Dirty Reads):所谓脏读就是对脏数据(Drity Data)的读取,而脏数据所指的就是未提交的数据。也就是                          说,一个事务正在对一条记录做修改,在这个事务完成并提交之前,这条数据是处于待定状态的(可能提交也可                               能回滚),这时,第二个事务来读取这条没有提交的数据,并据此做进一步的处理,就会产生未提交的数据依赖                             关系。这种现象被称为脏读。

                   2)不可重复读(Non-Repeatable Reads):一个事务先后读取同一条记录,但两次读取的数据不同,我们称之为不                          可重复读。也就是说,这个事务在两次读取之间该数据被其它事务所修改。

                  3)幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足                           其查询条件的新数据,这种现象就称为幻读。

  ② Repeatable read (可重复读):

           重复读,就是在开始读取数据(事务开启)时,不再允许更新(update)和删除(delete)(确保可以多次从该行读取相同的值),但是可以允许insert,所以就可能出现幻读。可避免脏读、不可重复读的发生。

  ③ Read committed (读已提交):

           读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。可避免脏读的发生。(读取的事务中可能插入了更新或删除的操作,出现不可重复读问题)

  ④ Read uncommitted (读未提交):

            读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。最低级别,任何情况都无法保证。(更新或插入的事务中可能插入了读的操作)

        以上四种隔离级别最高的是Serializable级别最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。

        在MySQL数据库中,支持上面四种隔离级别默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

        注意:可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

⑷ 持久性(Durability)

  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作

(5)事务的四大特性(ACID)的本质

        事务的(ACID)特性是由关系数据库管理系统(RDBMS,数据库系统)来实现的。数据库管理系统采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的初始状态。

数据库管理系统采用锁机制来实现事务的隔离性。当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。

参考:http://www.cnblogs.com/fjdingsd/p/5273008.html

猜你喜欢

转载自blog.csdn.net/Jack_PJ/article/details/88137873
今日推荐