spring boot 里面 事务踩的坑

我们都知道Spring 里面的事务分为

/**
*支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择
**/
int PROPAGATION_REQUIRED = 0;
/**
* 支持当前事务,如果当前没有事务,就以非事务方式执行。
**/
int PROPAGATION_SUPPORTS = 1;
/**
*支持当前事务,如果当前没有事务,就抛出异常。
**
int PROPAGATION_MANDATORY = 2;
/**
*新建事务,如果当前存在事务,把当前事务挂起。
**/
int PROPAGATION_REQUIRES_NEW = 3;
/**
*以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
**/
int PROPAGATION_NOT_SUPPORTED = 4;
/**
*以非事务方式执行,如果当前存在事务,则抛出异常。
**/
int PROPAGATION_NEVER = 5;
/**
*支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。
**/
int PROPAGATION_NESTED = 6;

当一个事务中嵌套很多事务的时候,容易出现问题 产品中执行一个操作,往表里面插入一行数据,在后面回对这个数据查询检索,如果我们对于检索的方法配置了 NOT_SUPPORTED ,那么就会出现永远查询不到刚插入的数据。所以针对配置 声明式事务 建议 readonly 的采用 SUPPORTS 其他的使用 REQUIRED,如果一些事务会锁表,而且会有高并发,我们应该采用 REQUIRES_NEW

转载于:https://my.oschina.net/u/1266813/blog/1929826

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Boot分布式事务的解决方案是JTA,即Java Transaction API。Spring Boot官方提供了Atomikos的解决思路。在项目中引入Atomikos的依赖,然后在配置文件中配置数据源和事务管理器即可实现分布式事务。具体步骤如下: 1.在pom.xml文件中引入Atomikos的依赖: ```xml <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-jta</artifactId> <version>4.0.6</version> </dependency> ``` 2.在application.properties文件中配置数据源和事务管理器: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jta.atomikos.datasource.ds1.unique-resource-name=ds1 spring.jta.atomikos.datasource.ds1.xa-data-source-class-name=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource spring.jta.atomikos.datasource.ds1.xa-properties.url=jdbc:mysql://localhost:3306/test spring.jta.atomikos.datasource.ds1.xa-properties.user=root spring.jta.atomikos.datasource.ds1.xa-properties.password=root spring.jta.atomikos.transaction-manager-id=tm ``` 3.在代码中使用@Transactional注解开启事务: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Transactional @Override public void transfer(int fromUserId, int toUserId, double amount) { userDao.decreaseBalance(fromUserId, amount); userDao.increaseBalance(toUserId, amount); } } ``` 以上就是Spring Boot分布式事务的解决方案。需要注意的是,使用JTA需要在应用服务器中配置JTA事务管理器,例如Tomcat需要配置Bitronix或Atomikos。同时,JTA也有一些缺点,例如性能较差,配置较为复杂等。因此,在实际项目中需要根据具体情况选择合适的事务解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值