文章目录
- 大事务引发的问题
- pom依赖
- 解决方法
- 1. 少用@Transactional 注解
- 2. 将查询(select)方法放到事务外
- 3. 事务中避免远程调用
- 4. 事务中避免一次性处理太多数据
- 5. 非事务执行
- 6. 异步处理
大事务引发的问题
在 分 享 解 决 办 法 之 前 ,先 看 看 系 统 中 如 果 出 现 大 事 务 可 能 会 引 发 哪 些 问题
pom依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.22</version>
</dependency>
解决方法
1. 少用@Transactional 注解
@Resource
private TransactionTemplate transactionTemplate;
public void save(final User user) {
transactionTemplate.execute ((status) -> {
//doSameThing...
return Boolean.TRUE;
});
}
2. 将查询(select)方法放到事务外
@Resource
private TransactionTemplate transactionTemplate;
public void save(final User user) {
queryData1 ();
queryData2 ();
transactionTemplate.execute ((status) -> {
addData1 ();
updateData2 ();
return Boolean.TRUE;
});
}
如果就是要使用 @ T r a n s a c t i o n a l 注 解 , 该 怎 么 拆 分 呢
在 本类中 注入自己,再进行调用,避免事务失效
@Service
public class ServiceA {
@Resource
private ServiceA serviceA;
public void save(User user) {
queryData1 ();
queryData2 ();
serviceA.doSave (user);
}
@Transactional(rollbackFor = Exception.class)
public void doSave(User user) {
addData1 ();
updateData2 ();
}
}
3. 事务中避免远程调用
远 程 调 用 的 代 码 可 能 耗 时 较 长 ,
切 记 一 定 要 放 在 事 务 之 外
@Resource
private TransactionTemplate transactionTemplate;
public void save(final User user) {
callRemoteApi ();
transactionTemplate.execute ((status) -> {
addData1 ();
return Boolean.TRUE;
});
}
4. 事务中避免一次性处理太多数据
解 决 办 法
是 分 页 处 理
1000 条 数 据 ,分 50 页 ,一 次 只 处 理 20 条 数 据 ,这 样 可 以 大 大 减 少 大 事 务 的 出 现 。
5. 非事务执行
@Resource
private TransactionTemplate transactionTemplate;
// .......
public void save(final User user) {
transactionTemplate.execute ((status) -> {
addData ();
return Boolean.TRUE;
});
addLog ();
updateCount ();
}
6. 异步处理
@Resource
private TransactionTemplate transactionTemplate;
//...
public void save(final User user) {
transactionTemplate.execute ((status) -> {
order ();
return Boolean.TRUE;
});
sendMq ();
}