Spring 事务

理解Spring 事务的使用
Spring 事务策略是通过 PlateformTransactionManager 接口体现的。
PlateformTransactionManager 接口 有许多不同的实现类,应用程序面向与平台无关的接口编程,当底层采用不同的持久层技术时,系统只需要使用不同的PlateformTransactionManager 实现类即可,而这种切换通常由Spring容器负责管理,应用程序无需从具体的事务API耦合,也无需与特定实现类耦合

下面讲一下getTransaction(TransactionDefinition definition),它返回一个TransactionStatus 对象,可能是一个新的事务,也可能是一个已经存在的事务,如果当前执行的线程已经处于事务管理下,那么返回当前线程的事务对象,否则重新创建一个事务对象返回。
TransactionDefinition 接口定义了一个事务规则。有如下几个属性值

1、 事务隔离性:当前事务与其他事务的隔离程度。例如这个事务是否看得到其他事务的未提交的数据。
2、 事务传播:通常在事务中执行的代码都会在当前事务中运行。但是如果一个事务上下文已经存在,有几个选项可指定该事物性方法的执行行为。例如,在大多数情况下,简单的在现有的事务上下文中运行;或者挂起现有事务创建新的事务。
3、 事务超时:事务在超市前能运行多久,也就是事务执行的最长时间,如果事务一直未被提交或者被回滚,将在超时后自动回滚事务。
4、 只读状态:只读事务不修改任何数据。在某些情况下只读事务时非常有用 的优化。
TransactionStatus 代表事务本身,它提供了简单的控制事务执行和查询事务状态的方法,这些方法在所有的事务API都是相同的。

我们使用编程式事务管理流程可能如下:
1、 声明数据源。
2、 声明一个事务管理类例如:DataSourceTransactionManager、HibernateTransactionManager、JTATransactionManager等
3、 然后我们就可以在我们的代码中加入事务处理代码

我们使用声明式事务事务管理流程如下:
1、 定义数据源 事务管理类
2、 Xml schema 方式提供了简洁的事务配置策略,tx:命名空间来配置事务管理,tx:命名空间下提供了<tx:advice…/>元素来配置事务增强处理,一旦该元素配置了事务增强处理,


Public interface PlateformTransactionManager{
        //平台无关的方法
TransactionStatus   getTransaction(TransactionDefinition definition);
Void commit(TransactionStatus status);
Void rollback(TransactionStatus status);

}


Public interface TransactionStatus {
        Boolean isNewTransaction();
        Void setRollbackOnly();
        Void isRollbackOnly();
}


<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <!-- 定义所有事务的传统属性,这些方法都属于服务层的操作方法 -->
    <tx:attributes>
        <tx:method name="insert*" propagation="REQUIRED" />
        <tx:method name="login*" propagation="REQUIRED" />
        <tx:method name="update*" propagation="REQUIRED" />
        <tx:method name="delete*" propagation="REQUIRED" />
        <tx:method name="add*" propagation="REQUIRED" />
        <tx:method name="new*" propagation="REQUIRED" />
        <tx:method name="set*" propagation="REQUIRED" />
        <tx:method name="change*" propagation="REQUIRED" />
        <tx:method name="edit*" propagation="REQUIRED" />
        <tx:method name="remove*" propagation="REQUIRED" />
        <tx:method name="get*" propagation="REQUIRED" read-only="true" />
        <tx:method name="find*" propagation="REQUIRED" read-only="true" />
        <tx:method name="list*" propagation="REQUIRED" read-only="true" />
        <tx:method name="load*" propagation="REQUIRED" read-only="true" />
        <tx:method name="exists*" propagation="REQUIRED" read-only="true" />
        <tx:method name="*" propagation="REQUIRED" read-only="true" />
    </tx:attributes>
</tx:advice>

就可以使用<aop:advisor…/>元素启用自动代理了
配置<tx:advice/>时除了需要Transaction-Manager属性指定事务管理器之外,还需要配置一个<attributes…>子元素,该元素里又可以包含多个<method/>子元素 ,实际上每个method元素都为一类方法指定了相应的事务定义,包括事务传播属性、事务隔离属性、超时时间、只读事务、对指定异常、对指定异常不回滚。
通常有如下属性
Name:指定该事务语义关联的方法名。
Propagation:指定事务传播行为,该属性值可为Propagation枚举类的任意值。
Isolation 指事务隔离级别
Read-only 指定是否是只读事务
Rollback-for:指定触发事务回滚的异常类(类的全限定名)多个名称用逗号隔开
No-rollback-for:指定不触发事务回滚的异常类

定义好tx:advice后我们还需要定义好切入点 以及把增强处理advice织入。具体配置代码如下

<aop:config>
        <aop:pointcut id=”” expression=””/>
        <aop:adivisor advice-ref=”” pointcut-ref=””/>
</aop:config>

这样就可以把增强处理织入
讲一下切入点提示符???????????
Execution
可以看到前面定义pointcut 表达式的时候,使用了execution表达式,其中execution就是一个的切入点提示符。与aspectJ不同,Spring aop仅仅支持方法作为连接点,所以Spring aop的接入点表达式只是匹配方法执行的连接点。
Execution(modifiers-pattern? Ret-type-pattern declaring-type-pattern? Name-pattern param-pattern)

* org.gjl..service..*.*(..))
第一个*代表返回值 为任意 
org.gjl..service..代表org.gjl.service当前包及其子包
第二个*代表任意类
之后的.*代表任一方法
(..)代表任意参数

除了返回型模式 名字模式 参数模式 之外所有的类型=都是可选的,返回类型模式决定了方法的返回类型必须依次匹配一个连接点,最频繁的返回类型模式是,它代表匹配任何类型的返回值。参数模式:()表示匹配一个不接受任何参数的方法()表示匹配一个接受任何参数的方法 (..)表示匹配一个接受任意数量参数的方法。名字模式匹配的是方法名

    exetion(Public * * (..))//任意公共方法的执行
    execution(* set* (..))//任何一个以名字以“set”开始的方法执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值