spring事务
Spring 事务概述
事务是一个不可分割的逻辑工作单元,具备ACID特性,实际工作中可借助Spring进行事务管理,Spring提供了两种事务管理方式, 编程式事务和声明式事务,本讲重点讲解实际项目中最常用的声明式事务管理,以简化事务的编码操作。
声明式事务的底层是使用 编程式事务方式来控制事务的,只不过对其进行了封装,让我们用起来更容易些。
例如现有两个订单操作,需要更新库存。
当库存充足时两个事务都可以成功,当库存不够时有的事务就要回滚。
Spring声明式事务管理底层基于AOP实现
Spring 声明式事务
Spring中声明式事务管理有两种方式,基于注解方式和基于xml方式。重点理解注解方式。
Spring 基于注解方式实现声明式事务管理。
-
在spring配置文件中启用事务注解
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--设置注解驱动的事务管理 --> <tx:annotation-driven transaction-manager="txManager"/> <tx:annotation-driven mode="aspectj" /> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf"> <property name="transactionManager" ref="transactionManager" /> </bean>
-
在类或方法中使用@Transaction注解应用事务
-
name 当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器。
-
propagation 事务的传播行为,默认值为 REQUIRED。
-
isolation 事务的隔离度,默认值采用 DEFAULT。
-
timeout 事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚事务。
-
read-only 指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。
-
rollback-for 用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。
-
no-rollback- for 抛出 no-rollback-for 指定的异常类型,不回滚事务。
-
Spring 基于XML配置方式实现声明式事务管理(了解)
<tx:advice id="txAdvice"
transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"
propagation="REQUIRED"
isolation="READ_COMMITTED"
timeout="-1"
read-only="false"
rollback-for="java.lang.Throwable"
no-rollback-for=”NoTransactionException"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="operation" expression="execution(* beans.service..*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut="operation"/>
</aop:config>
Spring 事务的传播特性
重点掌握 Propagation.REQUIRED
@Transactional(propagation=Propagation.REQUIRED)
如果没有事务创建新事务, 如果当前有事务参与当前事务
@Transactional(propagation=Propagation.REQUIRES_NEW)
必须是新事务, 如果有当前事务, 挂起当前事务并且开启新事务
@Transactional(propagation=Propagation.MANDATORY)
必须有事务, 如果当前没有事务就抛异常
@Transactional(propagation=Propagation.NEVER)
绝对不能有事务, 如果在事务中调用则抛出异常
@Transactional(propagation=Propagation.NESTED)
必须被嵌套到其他事务中
@Transactional(propagation=Propagation.NOT_SUPPORTED)
不支持事务
@Transactional(propagation=Propagation.SUPPORTS)
支持事务, 如果没有事务也不会创建新事务
Spring 事务的隔离级别
一共有4种, 一般采用 @Transactional(isolation=Isolation.READ_COMMITTED) 级别, 是并发性能和安全性折中的选择. 是大多数软件项目采用的隔离级别.
Spring事务隔离级别比数据库事务隔离级别多一个default
- DEFAULT (默认)
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应
-
READ_UNCOMMITTED (读未提交)
这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
-
READ_COMMITTED (读已提交)
保证一个事务修改的数据提交后才能被另外一个事务读取,另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。
-
REPEATABLE_READ (可重复读)
这种事务隔离级别可以防止脏读、不可重复读,但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读。
-
SERIALIZABLE(串行化)
这是花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。除了防止脏读、不可重复读外,还避免了幻像读。
标签:事务,隔离,propagation,spring,Propagation,Spring,级别 From: https://www.cnblogs.com/microstar/p/16991942.html