事务
1、事务的特性:(ACID)。
2、事务并发问题:(脏读、不可重复读、幻读)。
3、事务的隔离级别:(1:读未提交2:读已提交4:可重复读8:串行化)
spring事务
spring封装了事务的管理代码
事务操作:
1、打开事务
2、提交事务
3、回滚事务
事务操作对象:
因为在不同平台,操作事务的代码各不相同,spring提供了一个接口
PlatformTransactionManager接口(重要):
1、JDBC平台:DataSourceTransactionManager
2、Hibernate平台:HibernateTransactionManager
spring管理事务的属性介绍:
1、事务的隔离级别(1:读未提交2:读已提交4:可重复读8:串行化)
2、是否只读(true只读、false可操作)
3、事务的传播行为(决定业务方法之间调用,事务应该如何处理)
PROPAGION_XXX :事务的传播行为
保证同一个事务中
PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认)
PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务
PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常保证没有在同一个事务中
PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务
PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行
spring管理事务方式
方式一:编码式【了解】
方式二:xml配置(aop)【重要】
1、导包(aop、aspect、aop联盟、weaving织入包)
2、导入新的约束
beans:最基本的
context:读取properties文件
aop:配置aop
tx:配置事务通知
3、配置通知
<!-- 配置事务通知 -->
<tx:advice transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
</tx:attributes>
</tx:advice>
<!-- 配置织入 -->
<aop:config>
<aop:pointcut expression="excution(* cn.lc.service.*ServiceImpl.*(..))" id="txPc"/>
<!-- 配置切面 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPc"/>
</aop:config>
//扩展
<tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="persist*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="modify*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="remove*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="get*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
<tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
方式三:注解配置(aop)【重要】
1、导包(aop、aspect、aop联盟、weaving织入包)
2、导入新的约束
3、开启注解管理事务
<!-- 开启使用注解管理aop事务 -->
<tx:annotation-driven/>
4、使用注解
//可以在类上加或者方法上
@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)
public void transfer(final Integer form,final Integer to,final Double money) {}