事务的定义,事务的作用以及Spring事务原理

来源:互联网 发布:国家数据共享交换平台 编辑:程序博客网 时间:2024/05/01 16:38
首先,说说什么事务
(Transaction)。
事务,就是一组操作数据库的动作集合。
事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交。由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态。

事物的基本特征:

  • 事务是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。
  • 事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。
  • COMMIT表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。
  • ROLLBACK表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,滚回到事务开始的状态。
事务运行的三种模式:
  • 自动提交事务:每条单独的语句都是一个事务。每个语句后都隐含一个COMMIT。
  • 显式事务: 以BEGIN TRANSACTION显式开始,以COMMIT或ROLLBACK显式结束。
  • 隐性事务 :在前一个事务完成时,新事务隐式启动,但每个事务仍以COMMIT或ROLLBACK显式结束。
事务的特性(ACID特性)
  • 原子性(Atomicity) 事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
  • 一致性(Consistency)事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  • 隔离性(Isolation)一个事务的执行不能被其他事务干扰。
  • 持续性/永久性(Durability)一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
注:事务是恢复和并发控制的基本单位。

Spring事务原理

Spring事务策略,也就是spring事务管理的实现方式.它有一个统一的抽象是由实现下面这个接口完成的.org.springframework.transaction.PlatformTransactionManager
此接口的内容如下:

Public interface PlatformTransactionManager()...{  
TransactionStatue getTransaction(TransactionDefinition definition) throws TransactionException;  
Void commit(TransactionStatus status) throws TransactionException;  
Void rollback(TransactionStatus status) throws TransactionException;  
不管是声明式的还是编程式的事务管理都需要此抽象来完成.解释一下这个接口,这样可以更好的理解spring的事务控制的原理.getTransaction() 根据类型为TransactionDefinition的参数返回一个TransactionStatus对象.返回的 TransactionStatus对象可能代表一个新的或已经存在的事务(如果在当前调用堆栈有一个符合条件的事务).如同J2EE事务上下文,一个 TransactionStatus也是和执行的线程关联的.同时,在框架中还存在TransactionDefinition接口,即上边的参数类型.此接口指定了事务隔离程度、事务传播、事务超时、只读状态。
另外,还有TransactionStatus接口。这个接口为处理事务提供简单的控制事务执行和查询事务状态的方法。

统观spring事务,围绕着两个核心PlatformTransactionManager和TransactionStatus 

spring提供了几个关于事务处理的类: 
  • TransactionDefinition //事务属性定义
  • TranscationStatus //代表了当前的事务,可以提交,回滚。
PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。

一般事务定义步骤:

TransactionDefinition td = new TransactionDefinition();
TransactionStatus ts = transactionManager.getTransaction(td);
try
{ //do sth
transactionManager.commit(ts);
}
catch(Exception e){
transactionManager.rollback(ts);
}

spring提供的事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。

(1)编程式主要使用transactionTemplate。省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象.

void add()
{
    transactionTemplate.execute( new TransactionCallback(){
        public Object doInTransaction(TransactionStatus ts)
       { //do sth}
    }
}

(2)声明式:使用TransactionProxyFactoryBean:
<bean id="userManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
   <property name="transactionManager"><ref bean="transactionManager"/></property>
   <property name="target"><ref local="userManagerTarget"/></property>
   <property name="transactionAttributes">
    <props>
     <prop key="insert*">PROPAGATION_REQUIRED</prop>
     <prop key="update*">PROPAGATION_REQUIRED</prop>
     <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
    </props>
   </property>
</bean>

围绕Poxy的动态代理,能够自动的提交和回滚事务
org.springframework.transaction.interceptor.TransactionProxyFactoryBean

  • PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  • PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
  • PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
  • PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
  • PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
  • PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
0 0
原创粉丝点击