spring事务(三)
spring事务
spring事务类型
spring支持以下两种事务:
- 编程式事务
- 声明式事务
spring编程式事务(不使用)
编程式事务管理是 侵入性事务管理 ,使用TransactionTemplate或者直接使用PlatformTransactionManager接口,对于编程式事务管理,Spring推荐使用TransactionTemplate的实现类。这种入侵性的事务管理我们一般不用,因为这属于硬编码的写法,业务一改,就必须改代码,这是十分不好的。
public class UserService {
private final PlatformTransactionManager transactionManager;
public UserService(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public void createUser() {
TransactionStatus txStatus =
transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
userMapper.insertUser(user);
} catch (Exception e) {
transactionManager.rollback(txStatus);
throw e;
}
transactionManager.commit(txStatus);
}
}
spring声明式事务
配置事务管理器
属于前置工作,要使用spring的事务管理,需要配置事务管理器。
@Configuration
public class DataSourceConfig {
@Bean
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
@Bean
public DataSource dataSource(){
....
return dataSource;
}
}
spring声明式事务有两种方式,一种是通过xml文件进行配置,一种是通过注解的方式进行配置。我个人比较喜欢使用注解的方式。
相关注解
开启事务管理功能: @EnableTransactionManagement
事务注解: @Transactional
@Transactional
@Transactional 实质是使用了 JDBC 的事务来进行事务控制的,@Transactional 基于 Spring 的AOP
@Transactional的属性
- name 属性指定选择哪个事务管理器。
- propagation 事务的传播行为,默认值为 REQUIRED。
- isolation 事务的隔离度,默认值采用 DEFAULT。
- timeout 事务的超时时间,默认值为-1。
- read-only 指定事务是否为只读事务,默认值为 false;
- rollback-for 用于指定能够触发事务回滚的异常类型
- no-rollback- for 抛出 no-rollback-for 指定的异常类型,不回滚事务。
事务的隔离度
刚好对应数据库的几个隔离级别,默认是DEFAULT(数据库启用的隔离级别)
@Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据
@Transactional(isolation = Isolation.READ_COMMITTED):读取已提交数据
@Transactional(isolation = Isolation.REPEATABLE_READ):可重复读
@Transactional(isolation = Isolation.SERIALIZABLE):串行化
事务的传播行为
原文:https://www.cnblogs.com/mseddl/p/11577846.html
- PROPAGATION_REQUIRED
Spring默认的传播机制,能满足绝大部分业务需求,如果外层有事务,则当前事务加入到外层事务,一块提交,一块回滚。如果外层没有事务,新建一个事务执行- PROPAGATION_REQUES_NEW
该事务传播机制是每次都会新开启一个事务,同时把外层事务挂起,当当前事务执行完毕,恢复上层事务的执行。如果外层没有事务,执行当前新开启的事务即可- PROPAGATION_SUPPORT
如果外层有事务,则加入外层事务,如果外层没有事务,则直接使用非事务方式执行。完全依赖外层的事务- PROPAGATION_NOT_SUPPORT
该传播机制不支持事务,如果外层存在事务则挂起,执行完当前代码,则恢复外层事务,无论是否异常都不会回滚当前的代码- PROPAGATION_NEVER
该传播机制不支持外层事务,即如果外层有事务就抛出异常- PROPAGATION_MANDATORY
与NEVER相反,如果外层没有事务,则抛出异常- PROPAGATION_NESTED
该传播机制的特点是可以保存状态保存点,当前事务回滚到某一个点,从而避免所有的嵌套事务都回滚,即各自回滚各自的,如果子事务没有把异常吃掉,基本还是会引起全部回滚的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)