发布于 

SpringBoot手动提交事务

在 SpringBoot 项目中遇到这样一个问题,在一个方法中使用了事务注解,所以方法的事务会在整个方法执行完毕后才提交。

现在需要对方法内的某一事务单独先提交。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test {

@Transactional
public void A() {
// 其他代码
B();
// 其他代码
}

public void B() {
// 执行方法逻辑
}

}

代码如上。

一开始给 B 方法也加上事务注解。

1
2
3
4
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void B() {
// 执行方法逻辑
}

使用 @Transactional(propagation = Propagation.REQUIRES_NEW) 注解,通过开启一个新事物,来让 B 方法的事务单独提交。

经过测试无效。

最终使用手动提交事务,解决此问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Test {

@Autowired
private DataSourceTransactionManager transactionManager; //注入数据库事务管理器

@Transactional
public void A() {
//其他代码
B();
//其他代码
}

public void B() {
// 创建事务定义
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
transactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
// 开始新的事务
TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition);
try {
// 执行方法逻辑

// 提交事务
transactionManager.commit(transactionStatus);
} catch (Exception e) {
// 回滚事务
transactionManager.rollback(transactionStatus);
}
}

}