spring事务相关

spring事务的实现方式

1、通过使用spring的定义事务通知与AOP相关配置实现


<tx:advice id="advice" transaction-manager="transactionManager">
    <tx:attributes>
        
        <tx:method name="save*" propagation="REQUIRED" isolation="READ_COMMITTED" timeout="" read-only="false" no-rollback-for="" rollback-for=""/>
        
        <tx:method name="*" propagation="SUPPORTS"/>
    tx:attributes>
tx:advice>

<aop:config>
    <aop:pointcut expression="execution(* com.kaizhi.*.service.impl.*.*(..))" id="pointcut"/>
    
    <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
aop:config>

2、通过@Transactional实现事务的管理

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">   
     <property name="dataSource" ref="dataSource"/>
bean>    

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

@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED),具体参数跟上面中一样
Spring提供的@Transaction注解事务管理,内部同样是利用环绕通知TransactionInterceptor实现事务的开启及关闭。

使用@Transactional注解需要注意:

  • 如果在接口、实现类或方法上都指定了@Transactional 注解,则优先级顺序为方法>实现类>接口;
  • 建议只在实现类或实现类的方法上使用@Transactional,而不要在接口上使用,这是因为如果使用JDK代理机制(基于接口的代理)是没问题;而使用使用CGLIB代理(继承)机制时就会遇到问题,因为其使用基于类的代理而不是接口,这是因为接口上的@Transactional注解是“不能继承的”;
    这里写图片描述

spring事务的五大隔离级别:

除了ISOLATION_DEFAULT(底层数据库默认级别)以外,其他四个级别和数据库隔离级别相同

  • ISOLATION_DEFAULT:用底层数据库的默认隔离级别,数据库管理员设置什么就是什么
  • ISOLATION_READ_UNCOMMITTED(未提交读):最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读)
  • ISOLATION_READ_COMMITTED(已提交读):一个事务提交后才能被其他事务读取到(该隔离级别禁止其他事务读取到未提交事务的数据、所以还是会造成幻读、不可重复读)、sql server默认级别
  • ISOLATION_REPEATABLE_READ(可重复读):可重复读,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(该隔离基本可防止脏读,不可重复读(重点在修改),但会出现幻读(重点在增加与删除))(MySql默认级别,更改可通过set transaction isolation level 级别)
  • ISOLATION_SERIALIZABLE(序列化):代价最高最可靠的隔离级别(该隔离级别能防止脏读、不可重复读、幻读)

    解析

    幻读与不可重复读的区别
    幻读的重点在于插入与删除,即第二次查询会发现比第一次查询数据变少或者变多了,以至于给人一种幻象一样;
    而不可重复读重点在于修改,即第二次查询会发现查询结果比第一次查询结果不一致,即第一次结果已经不可重现了。

spring事务的七大传播行为

  • PROPAGATION_REQUIRED:支持当前事务,如当前没有事务,则新建一个。
  • PROPAGATION_SUPPORTS:支持当前事务,如当前没有事务,则已非事务性执行。
  • PROPAGATION_MANDATORY:支持当前事务,如当前没有事务,则抛出异常(强制一定要在一个已经存在的事务中执行,业务方法不可独自发起自己的事务)。
  • PROPAGATION_REQUIRES_NEW:始终新建一个事务,如当前原来有事务,则把原事务挂起。
  • PROPAGATION_NOT_SUPPORTED:不支持当前事务,始终已非事务性方式执行,如当前事务存在,挂起该事务。
  • PROPAGATION_NEVER:不支持当前事务;如果当前事务存在,则引发异常。
  • PROPAGATION_NESTED:如果当前事务存在,则在嵌套事务中执行,如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作

你可能感兴趣的:(spring)