Spring框架事务的开启

haidaoxianzi 2020-03-23

一、Spring中事务的隔离级别

Spring框架事务的开启
  此处涉及到数据库事务的四大特征:ACID---隔离性引发的问题 ;
        MySQL默认隔离级别是:REPEATABLE_READ
 
二、Spring中事务的传播行为
  Spring框架事务的开启
  可以分为三类:        
     1、PROPAGATION_REQUIRED(默认类型)、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY    属于:支持当前事务。如:A调用B,如果A事务存在,B和A处于同一个事务事务默认传播行为是:REQUIRED;        
     2、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER    属于:不会执行原来的事务。如:A调用B,如果A事务存在,B肯定不会和A处于同一个事务;        
     3、PROPAGATION_NESTED    属于:嵌套事务,只对DataSourceTransactionManger起效,底层使用JDBC的SavePoint机制,允许在同一个事务设置保存点,回滚保存点。        
     用户管理事务,需要先配置TransactionDefinition(事务定义信息,事务的管理方案),然后根据需要先配置TransactionDefinition,通过TransactionManager(事务管理器)进行事务管理,事务运行过程中,每个时刻都可以通过TransactionStatus(事务状态)来了解事务的运行状态。
 
三、Spring中事务的具体配置方法
  1、利用XML+aop的配置方式      
    该方式方便将事务进行统一管理
    
<!-- 配置事务 -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource"></property>

</bean>

 

<!-- 定义事务的传播行为 -->

<tx:advice id="txAdvice" transaction-manager="transactionManager">

<tx:attributes>

<!-- 所有以update delete save开头的方法都进行事务管理 -->

<tx:method name="update*" propagation="REQUIRED"/>

<tx:method name="delete*"/>

<tx:method name="save*"/>

<!-- 查询不做事务处理 -->

<tx:method name="find*" read-only="true"/>

<tx:method name="get*" read-only="true"/>

<tx:method name="select*" read-only="true"/>

</tx:attributes>

</tx:advice>

<!-- 定义切面 -->

<aop:config>

<aop:pointcut expression="execution(* org.service.*.*(..))" id="myPointcut"/>

<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/>

</aop:config>

2、XML+注解的方式

<!-- 事务管理器 -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource"></property>

</bean>

<!-- 使用事务注解@Transational来给具体的方法添加事务要求,缺点是不能统一处理,使用tx:advice方式来进行aop处理则可以统一处理事务 -->

<tx:annotation-driven transaction-manager="transactionManager"/>

2.2  在需要事务处理的类中添加注解

@Transactional     

  params: readOnly,是否只读,true为只读,false为非只读;     

  params: propagation,设定事务的传播行为

 

相关推荐

itjavashuai / 0评论 2020-07-27