Spring声明式事务处理

来源:互联网 发布:java if 缩写 编辑:程序博客网 时间:2024/05/21 01:32

spring框架下的项目,事务处理都是由spring框架来自动实现,程序员只需要关心实现增删改查曾操作就可以。二者结合在一起就形成了代理对象,这也是面向切面编程的思想。

声明:程序员告诉spring哪些类需要事物,哪些类不需要事物。

事务处理:spring来进行实际的事务处理操作。

通过<tx:advice id="txAdvice" transaction-manager="transactionManager"> </tx:advice> 事务管理器标签进行通知

1、告诉spring容器采用什么样的方法处理事务。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
      <!--  数据库驱动 -->
       <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
       <!-- 数据库地址 -->
       <!-- ?useUnicode=true&amp;characterEncoding=utf-8是将编码格式改成utf-8 -->
       <!-- 如果报:The reference to entity "characterEncoding" must end with the ';' delimiter.错误,说明无法解析xml中的特殊符号,而且要;结尾。转换:&amp=& -->
       <property name="url" value="jdbc:mysql://localhost:3306/gmo?useUnicode=true&amp;characterEncoding=utf-8" />  
      <!--  用户名密码 -->
       <property name="username" value="root" />  
       <property name="password" value="root" />  
   </bean>  

<!-- 声明一个bean,将dataSource注入进来、告诉spring容器,采用什么样的方式处理事务 ,这里用的是mysql方式-->  
   <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
       <property name="dataSource">  
           <ref local="dataSource" />  
       </property>  
   </bean>

2、告诉spring容器,目标方法采用什么样的事务处理策略。

 <!-- 通知:
  告诉spring容器,目标方法采用什么样的事物处理策略
  -->
   <tx:advice id="txAdvice" transaction-manager="transactionManager">  
    <tx:attributes>
    <!-- name=方法名,isolation隔离机制,默认DEFAULT,一般不需写。
    propagation传播属性默认REQUIRED,一般不需要写
    read-only=true只读事物
    rollback-for="java.lang.Exception"回滚
    -->
    <tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
    <!-- 除了以上方法,其他方法一律是只读方法 -->
    <tx:method name="find*" isolation="DEFAULT" propagation="REQUIRED"  read-only="true"/>
    <tx:method name="get*" propagation="REQUIRED" read-only="true"/>
    <tx:method name="query*" propagation="REQUIRED" read-only="true"/>
    </tx:attributes>
   </tx:advice>
   <!-- 声明切面目标类,配置哪些类的方法需要进行事务管理 -->
   <aop:config proxy-target-class="true">
   <!-- 切入點是素有service下的类 -->
        <aop:pointcut expression="execution(* cn.forlink.service..*(..))" id="pointcut"/>
         <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
     </aop:config>

spring所有的事物处理都是实现了PlatformTransactionManager接口。

我们来看一下这个接口底层的源码:

public interface PlatformTransactionManager
{
    public abstract TransactionStatus getTransaction(TransactionDefinition transactiondefinition)
        throws TransactionException;
    public abstract void commit(TransactionStatus transactionstatus)
        throws TransactionException;
    public abstract void rollback(TransactionStatus transactionstatus)
        throws TransactionException;
}

这个接口实现了1、获取事物2、提交事物3、回滚事物。


暂时先记录一部分,过一段时间再来修改>_<

0 0
原创粉丝点击