什么是事务?事务有哪些特征!?

事务的ACID属性

A(Atomicity)原子性: 在一个事务上下文里面,对数据库进行的任何操作,必须保证是原子的,也就是说要么不做,要么全部都做,不能只做一部分。比如insert一条数据和delete一条数据,不知能只做insert操作而不做delete操作

 

C(Consistency) 一致性:在事务的处理过程中,数据库必须时刻要避免被置于不一致 (inconsistent)的状态。这意味着在事务期间,每次对数据库实施的插入、更新或删除操作 时,数据库的完整性约束(integrity constraints)都要得到保证,即使在事务还未被提交时 也必须如此。比如非空约束。

 

I(Isolation)隔离性:两个不同的事务相互之间是彼此隔离程度。有一种说法是事务之间是彼此隔离的,一个事务不能够读取另一个事务未提交的数据,这个不太准确,这个属于事务的隔离级别。wiki上的解释是“

The isolation property ensures that the concurrent execution of transactions results in a system state that could have been obtained if transactions are executed serially, i.e. one after the other“

 

D(Durability)持久性:事务一旦提交,在事务中对数据库进行的修改也就进行持久化存储了,不会由于系统故障导致提交后的数据丢失。

 

ACID是关系型数据库最重要的特性。

 

在spring的 TransactionDefinition 类里面进行定义。具体有以下几个数值

Required(需要)

Mandatory(强制必须)

RequiresNew(需要新的)

Supports(支持)

NotSupported(不支持)

Never(不用)

 

Required:当前方法必须要求开启事务,如果当前线程不存在事务,则开启新的事务,如果当前线程已经存在事务,就加入到当前事务。这个是经常使用的。但是要注意的就是一旦事务中某一个方法回滚,当前事务上下文里面所有的操作都回滚,

 

Required New:当前方法必须要求开启新的事务,如果当前线程已经存在事务上下文,就暂停当前事务,等到新事务结束之后,在继续恢复之前的事务。就拿上面的例子来 说,methodB的对事务的修改不会影响到methodA。两个事务之间不会互相影响。经常可以用到的场景就是在业务发生异常的时候发送短消息。如果业 务发生异常,业务回滚,但是由于发送段消息是新的事务,不会受到业务异常的影响。

 

Mondary:当前方法必须要求事务,如果当前线程不存在事务,就抛出异常,如果存在,就加入到事务里。

 

Support:当前方法支持事务,如果当前线程存在事务,就加入到事务中去,如果不存在,不做任何操作。

 

Not Support:当前方法不支持事务,如果当前线程存在事务,就挂起当前事务,执行完当前方法,恢复事务。一般情况下在查询的时候使用,如果一个方法只是查询,并且非常耗时,就可以使用Not Support,避免事务时间超长。

 

Never:当前方法不支持事务,如果当前线程存在事务,则抛出异常。这种用的比较少。

 

 

原文链接  http://www.cnblogs.com/aigongsi/archive/2012/10/09/2716086.html

原文 举例  读已提交,插入会出现脏读,本人测试未重现

posted @ 2015-07-07 15:05  喝酒骑驴撞城管  阅读(298)  评论(0编辑  收藏  举报