spring事务控制
事务特性:
-
原子性:事务应该当作一个单独单元的操作,这意味着整个序列操作要么是成功,要么是失败的。
-
一致性:这表示数据库的引用完整性的一致性,表中唯一的主键等。
-
隔离性:可能同时处理很多有相同的数据集的事务,每个事务应该与其他事务隔离,以防止数据损坏。
-
持久性:一个事务一旦完成全部操作后,这个事务的结果必须是永久性的,不能因系统故障而从数据库中删除。
事务管理包括编程式事务管理和声明式事务管理, 声明式事务管理作为一种横切关注点,声明式事务管理可以使用 AOP 方法进行模块化。Spring 支持使用 Spring AOP 框架的声明式事务管理。
编程式事务管理:复杂不建议使用。
声明式事务:目标方法会在 try / catch 块中执行。如果方法正常结束,AOP 建议会成功的提交事务,否则它执行回滚操作。
步骤1:在spring配置文件中配值bean,开启注解配置
<!-- 配置spring事务控制器 -->
<bean id="dstm" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dbcp"/>
</bean>
<!-- 开启事物注解配置@tansactional -->
<tx:annotation-driven transaction-manager="dstm"/>
另外:如果不使用xml方式配置,在配置类上加入
@Configuration
@EnableTransactionManagement //开启事务注解
public class SpringTxConfiguration {
//里面配置数据源,配置配置事务管理器。
}
在需要事物控制的类上或者和方法前加上@Transactional, @Transactional 注解应该只被应用到 public 方法上方法优于类,spring在调用有注解的方法时,如果遇到异常就会回滚事物,如果没有就正常执行,常写在service中
@Transactional()中可以有一些属性值
readOnly (默认false)
select的时候可以写readOnly=true,表示事务只读数据库
rollbackFor:(默认runtimeexcepton.class和error )
可以指定遇到什么异常回滚,xx.class,追加,原来的runtime也回滚
noRollbackFor:遇到那种异常不回滚
propagation 一个事务方法调用另一个事务方法的传播,常用如下,还有其他事务类型
默认REQUIRED,在当前事务中运行 a方法调用b方法,a新启一个事务,运行到b方法,b也是一个事务,所以b就在a的事务里运行。
REQUIRED_NEW 当前方法新启事务,有事务在运行,挂起运行的事务,a方法调用b,a新启事务,遇到b方法,a事务挂起,b新启事务,b事务结束,然后a事务开启,直至结束。
isolation(默认DEFAULT,根据数据库能力自己选择)
事务隔离,一个应用程序对同一个数据集操作,并发时产生一些问题
* 并发事务所导致的问题可以分为下面三种类型:
* 脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但 还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
* 不可重复读:对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
* 幻读:对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.
READ_UNCOMMITED 读未提交,不能解决前三个问题
READ_COMMITED 只允许读取被其他事务提交更改的字段,能解决脏读问题
REPEATABLE_READ 确保事务多次读书字段是同一个值,能解决脏读、不可重复读问题
SERIALIZABLE 确保事务操作的时候,整个表不能被其他事务操作增删改,其他事务可以查询,解决所有问题,但效率低
DEFAULT 默认,大多数数据库默认READ_COMMITED
隔离级别以次增加,安全性增强,并发处理降低,时不同数据库底层处理的
spring 事务管理
原文:https://www.cnblogs.com/zhouyanger/p/13564444.html