在 分 享 解 决 办 法 之 前 ,先 看 看 系 统 中 如 果 出 现 大 事 务 可 能 会 引 发 哪 些 问题
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-txartifactId>
<version>5.3.22version>
dependency>
@Resource
private TransactionTemplate transactionTemplate;
public void save(final User user) {
transactionTemplate.execute ((status) -> {
//doSameThing...
return Boolean.TRUE;
});
}
@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 ();
}
}
远 程 调 用 的 代 码 可 能 耗 时 较 长 ,
切 记 一 定 要 放 在 事 务 之 外
@Resource
private TransactionTemplate transactionTemplate;
public void save(final User user) {
callRemoteApi ();
transactionTemplate.execute ((status) -> {
addData1 ();
return Boolean.TRUE;
});
}
解 决 办 法
是 分 页 处 理
1000 条 数 据 ,分 50 页 ,一 次 只 处 理 20 条 数 据 ,这 样 可 以 大 大 减 少 大 事 务 的 出 现 。
@Resource
private TransactionTemplate transactionTemplate;
// .......
public void save(final User user) {
transactionTemplate.execute ((status) -> {
addData ();
return Boolean.TRUE;
});
addLog ();
updateCount ();
}
@Resource
private TransactionTemplate transactionTemplate;
//...
public void save(final User user) {
transactionTemplate.execute ((status) -> {
order ();
return Boolean.TRUE;
});
sendMq ();
}