什么是ACID特性,数据库如何保证ACID特性的? 事务的传播特性与隔离级别?

什么是ACID特性,数据库如何保证ACID特性的?

ACID,是指在数据库管理系统DBMS)中,事务(transaction)所具有的四个特性:原子性(Atomicity)一致性(Consistency)隔离性(Isolation,又称独立性)持久性(Durability)

在数据库系统中,一个事务是指:由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和,构成一个完整的逻辑过程,不可拆分。这个过程被称为一个事务,具有ACID特性。ACID的概念在ISO/IEC 10026-1:1992文件的第四段內有所說明。

 

  • 原子性:一整个交易中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。交易在执行过程中发生错误,会被回復(Rollback)到交易开始前的状态,就像这个交易从来没有执行过一样。
  • 一致性:在交易开始之前和交易结束以后,数据库的完整性限制没有被破坏。
  • 隔离性:两个交易的执行是互不干扰的,一个交易不可能看到其他交易运行时,中间某一时刻的数据。
  • 持久性:在交易完成以后,该交易对数据库所作的更改便持久地保存在数据库之中,并不会被回復。

Oracle中用并发与多版本(非阻塞读)保持一致性隔离性,用事务的commit,rollback,savepoint保持原子性,用数据库文件保持持久性,断电后,内存数据丢失,硬盘文件数据不丢失,重启后从文件中加载到内存,保持持久性


事务的传播特性?

事务的传播行为

REQUIRED:
   业务方法需要在一个事务中运行,如果方法运行时,已经存在一个事务中,那么加入到该事务,否则自己创建一个新事务。

NOT_SUPPORTED:
   声明方法不需要事务,如果方法没有关联到事务,容器不会为它开启事务,如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。

REQUIRESNEW:
  不管是否存在事务,业务方法总为自己发起一个新事务;如果方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到方法调用结束,新事务才结束,原先的事务再恢复执行。

MANDATORY
   业务方法只能在一个已经存在的事务中进行,业务方法不能发起自己的事务,如果方法在没有事务的环境中调用,那么容器会抛出例外。

SUPPORTS:
   如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分,如果业务方法在事务外被调用,则方法在没有事务的环境下执行。

NEVER:
   业务方法绝对不能再事务范围内执行,如果方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,方法才能够正常执行。

NESTED:
  如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按照REQUIRED属性执行,它使用了一个单独的事务,这个事务有多个可以回滚的保存点,内部事务的回滚不会对外部事务产生影响。它只对DataSourceTransactionManager事务管理器有效。


事务传播特性了解事务的几种传播特性

 

 

据库操作1

数据库操作2

PROPAGATION_REQUIRED

Transaction1

Transaction1

null

Transaction2

PROPAGATION_SUPPORTS

Transaction1

Transaction1

null

null

PROPAGATION_MANDATORY

 

Transaction1

Transaction1

null

Throws Exception

PROPAGATION_REQUIRES_NEW

 

Transaction1

Transaction2

null

Transaction2

PROPAGATION_NOT_SUPPORTED

 

Transaction1

null

null

null

PROPAGATION_NEVER

 

Transaction1

Throws Exception

null

null

PROPAGATION_NESTED(Spring)

 

Transaction1

Transaction2

[Transaction1]

null

Transaction2

         1.      PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启

         2.      PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行

         3.      PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

         4.      PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

         5.      PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。

         6.      PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常

         7.      PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务,

              则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行

---------------------------------------------------------------------

事务的隔离级别?


事务的隔离级别

注:Spring中事务的隔离级别是由数据库实现的


ISOLATION_DEFAULT
    这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应
ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读

ISOLATION_READ_COMMITTED
    保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。

ISOLATION_REPEATABLE_READ
    这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。

ISOLATION_SERIALIZABLE
    这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。

脏读:
    一个事务读取到另一个事务未提交的更新数据。
不可重复读:
    在同一事务中,多次读取同一数据返回的结果有所不同,即后续读取可以读取到另一事务已提交的更新数据;相反,"可重复读"是指在同一事务中多次读取数据时,能够保证所读取的数据是一样,即后续读取不能读到另一事务已提交的数据。
幻读:
    一个事务读取到另一事务已提交的insert数据。


事务隔离级别

 

脏读

不可重复读

幻象读

ISOLATION_READ_UNCOMMITTED

ISOLATION_READ_COMMITTED

 

ISOLATION_REPEATABLE_READ

 

 

ISOLATION_SERIALIZABLE

 

 

 

ISOLATION_DEFAULT

PlatfromTransactionManager

默认的隔离级别

SQLServer :READ_COMMITTED

MySql:REPEATABLE_READ

 

Spring事务的隔离级别

         1.      ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.

              另外四个与JDBC的隔离级别相对应

         2.      ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。

              这种隔离级别会产生脏读,不可重复读和幻像读。

         3.      ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据

         4.      ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。

         5.      ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。

              除了防止脏读,不可重复读外,还避免了幻像读。


脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

不可重复读是 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。

那么,在第一个事务中的两次读数据之间,由于第二个事务的修 改,那么第一个事务两次读到的的数据可能是不一样的。

幻觉读是 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行

。同时,第二个事务也修改这个表中的 数据,这种修改是向表中插入一行新数据。

那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。   

其他关于事务的url:

事务的传播性和隔离级别
http://blog.csdn.net/puyun9494/archive/2010/05/11/5579273.aspx

数据库事务的隔离级别
http://www.kingbase.com.cn/BBS/dispbbs.asp?boardid=11&Id=50
http://www.itpub.net/thread-914687-1-1.html#




事务数据库操作的一个逻辑单元,它保证了数据的一致性和完整性。事务有四个基本特性,也称为ACID特性: 1. **原子性** (Atomicity):事务的所有操作要么全部完成,要么全部不做,不会部分执行。 2. **一致性** (Consistency):事务开始前和结束后,数据库的数据都要保持在一致的状态。 3. **隔离性** (Isolation):确保并发环境下的事务看起来像是独自运行,互不影响,包括读未提交、已提交和序列化等隔离级别。 4. **持久性** (Durability):一旦事务提交,其对数据库的影响是永久的,即使系统崩溃也能恢复。 在并发环境下,隔离级别用于解决可能出现的问题,常见的隔离级别有: - **读未提交(Read Uncommitted)**:允许读取其他事务未提交的数据,可能导致脏读。 - **已提交(Read Committed)**:只读取已经提交的数据,避免脏读,但仍存在幻读。 - **可重复读(Repeatable Read)**:在此级别下,一次事务的多次读取结果不变,但可能会看到幻灭现象(因为其他事务的插入)。 - **串行化(Serializable)**:最严格的级别,强制事务按照某种顺序执行,完全消除幻读。 事务传播属性定义了当在一个事务调用另一个事务时的行为,如: - **支持(Support)**:默认值,如果目标操作在当前事务,就执行。 - ** Requires**:只有当目标操作成功才会继续。 - ** Not Supported**:禁止嵌套事务。 - ** Requires New**:在新的事务上下文执行。 - ** MANDATORY**:如果目标操作在事务,强制其成为新事务的一部分。 - ** REQUIRES NEW**:总是新建一个新的事务来执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值