Spring-事务

Posted Vodka~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring-事务相关的知识,希望对你有一定的参考价值。

1.事务管理器:

二,Spring不直接管理事务,而是提供了多种事务管理器,将事务管理的职责委托给其他持久化机制所提供的相关平台框架的事务来实现,简而言之,spring提供了事务管理接口的模板,其他框架面对接口实现具象化编程。

三、事务配置:
1.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <!--      设置spring自动化扫描注解范围  -->
    <context:component-scan base-package="com.vodka" />
      
    <!--   开启aop自动代理  -->
    <aop:aspectj-autoproxy/>

    <!--   配置事务管理器   -->
     <bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <!--   数据源       -->
            <property name="dataSource" ref="c3p0"></property>
     </bean>
    <!-- 配置事务通知
            1. transaction-manager 属性表示当前事务是哪个事务管理器管理的
            2. tx:method 的属性:
                  -name:  必须的,表示与事务属性关联的方法名,对切入点进行细化。
                          通配符 (*) ,可以用来指定一批关联到相同的事务属性的方法。
                          如: get* , handle* , on*Event 等等。
                  -propagation: 非必须,默认值为required,表示事务的传播行为
                  -isolation: 非必须,默认值是DEFAULT,表示事务的隔离级别
                  -timeout: 非必须,默认值-1(永不超时),表示事务超时间。
                  -read-only: 非必须,默认值false,表示事务是否只读
                  -rollback-for:  非必须,表示将被触发进行回滚的 Exception(s): 以逗号分开,如:
                                  com.vodka.MyBusinessException,ServletException
                  -no-rollback-for: 非必须,表示不被触发则进行回滚的Exception(s): 以逗号分开                
                                 com.vodka.MyBusinessException,ServletException
                                 任何RuntimeException 将触发事务回滚
      -->

    <!--       加载自定义的jdbc.properties配置, 可以读取jdbc.properties 配置文件中的数据 -->
    <context:property-placeholder location="jdbc.properties"/>
     
   <!-- 配置事务通知 -->
    <tx:advice id="txAdvice" transaction-manager = "TransactionManager">
           <!-- 对以 add  ,update,delete,query 开头的所有方法进行事务处理         -->
        <tx:attributes>
            <tx:method name="Add*" propagation="REQUIRED"/>
            <tx:method name="Modify*" propagation="REQUIRED"/>
            <tx:method name="Query*" propagation="REQUIRED" read-only="true"/>
            <tx:method name="Delete*" propagation="REQUIRED"/>
            <tx:method name="Transition*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

    <!--  定义切面: 切入点和通知   -->
     <aop:config>
          <!--  设置切入点,以及要拦截的范围的方法        -->
         <aop:pointcut id="cut" expression="execution(* com.vodka.Service..*.*(..))"></aop:pointcut>
            <!--  设置通知,参照事务通知         -->
         <aop:advisor advice-ref="txAdvice" pointcut-ref="cut"></aop:advisor>
     </aop:config>     

    <!--       c3p0连接池配置-->
    <bean id="c3p0" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!--              property标签的value属性对应的是jdbc.properties的相应属性(自定义配置文件)-->
        <property name="driverClass" value="$jdbc.driver"/>
        <property name="jdbcUrl" value="$jdbc.url"/>
        <property name="user" value="$jdbc.user"/>
        <property name="password" value="$jdbc.password"/>
    </bean>

    <!--模板类配置,Spring 把JDBC中重复的操作建立成了一个模板类: org.springframework.jdbc.core.jdbcTemplate-->
    <!--       配置实例,并注入一个c3p0类型的数据源连接池 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="c3p0"/>
    </bean>
</beans>

2.配置注解事务通知

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <!--      设置spring自动化扫描注解范围  -->
    <context:component-scan base-package="com.vodka" />

    <!--   开启aop自动代理  -->
    <aop:aspectj-autoproxy/>

    <!-- 配置事务的注解支持   -->
    <tx:annotation-driven transaction-manager="TransactionManager"/>


    <!--   配置事务管理器   -->
     <bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <!--   数据源       -->
            <property name="dataSource" ref="c3p0"></property>
     </bean>

    <!--  定义切面: 切入点和通知   -->
     <aop:config>
          <!--  设置切入点,以及要拦截的范围的方法        -->
         <aop:pointcut id="cut" expression="execution(* com.vodka.Service..*.*(..))"></aop:pointcut>
            <!--  设置通知,参照事务通知         -->
         <aop:advisor advice-ref="txAdvice" pointcut-ref="cut"></aop:advisor>
     </aop:config>

    <!--       加载自定义的jdbc.properties配置, 可以读取jdbc.properties 配置文件中的数据 -->
    <context:property-placeholder location="jdbc.properties"/>

    <!--       c3p0连接池配置-->
    <bean id="c3p0" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!--              property标签的value属性对应的是jdbc.properties的相应属性(自定义配置文件)-->
        <property name="driverClass" value="$jdbc.driver"/>
        <property name="jdbcUrl" value="$jdbc.url"/>
        <property name="user" value="$jdbc.user"/>
        <property name="password" value="$jdbc.password"/>
    </bean>

    <!--模板类配置,Spring 把JDBC中重复的操作建立成了一个模板类: org.springframework.jdbc.core.jdbcTemplate-->
    <!--       配置实例,并注入一个c3p0类型的数据源连接池 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="c3p0"/>
    </bean>
</beans>

@Service
public class AccountService 

    @Autowired
    private AccountImp accountImp;

    //One向Two转钱,作为一个事务来执行,不可分割
    @Transactional(propagation = Propagation.REQUIRED)
    public  int TransitionService(int IDOne, int IDTwo, int transientMoney)
        int rowsOne = accountImp.OutAccount(IDOne,transientMoney);
        int i = 10 / 0 ;
        int rowsTwo = accountImp.InAccount(IDTwo,transientMoney);
        if( rowsOne == rowsTwo )
            return 1;
        
        return -1;
    

3.通常都是xml配置和注解配置事务结合使用。

以上是关于Spring-事务的主要内容,如果未能解决你的问题,请参考以下文章

Spring-事务

Spring JPA事务通过多种方法

Spring cache支持多种类型缓存(事务敏感缓存)

Spring事务

Spring事务管理 与 SpringAOP

spring 声明式事务原理解读