更新時間:2022-03-23 10:10:32 來源:動力節(jié)點 瀏覽2465次
在mybatis批量操作中,插入多條數(shù)據(jù)時,設(shè)置回滾,但是之前的幾條還是插入的。嘗試后
官網(wǎng)api上的openSession(false)可以回滾,但是用session查看還是可以的。獲取連接()。獲取自動提交 ()
將 DataSource 配置更改為 AutoCommit (false)
設(shè)置setAutoCommit(false)為conn,用conn提交和回滾
SqlSession session = sqlSessionFactory.openSession(false);
Connection conn = session.getConnection();
conn.setAutoCommit(false);
try {
UserMapper mapper = session.getMapper(UserMapper.class);
for (String name : names) {
// Various operations
User user = new User();
user.setName(name);
// Insert, require rollback
mapper.insert(user);
}
conn.commit();
} catch (Exception e) {
// There are repeated rollbacks
conn.rollback();
throw e;
} finally {
session.close();
}
補充:Spring Boot + Mybatis Plus 手動觸發(fā)事務(wù)回滾
使用第一種方法(省略數(shù)據(jù)庫操作的代碼)操作Mybatis Plus的事務(wù),如果有異常進入catch,數(shù)據(jù)庫操作不會回滾,但是會報No transaction aspect-managed TransactionStatus in scope的錯誤改為報告。修改為第二種方法可以正常管理和回滾事務(wù)
請參閱此情況的說明:
@Transactional必須觸發(fā)aop代理才能生效,所以非公有方法不執(zhí)行事務(wù),而公有方法在該類中被引用不執(zhí)行事務(wù)
方法一:
@PostMapping("/save1")
public boolean action01() {
return action00();
}
@PostMapping("/save2")
public boolean action02() {
return action00();
}
@Transactional
private boolean action00() {
String result = true;
try {
System.out.println(1/0);
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
result = false;
}
return result;
}
方法二:
@PostMapping("/save1")
@Transactional
public boolean action01() {
boolean result = action00();
if (!result){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return result;
}
@PostMapping("/save2")
@Transactional
public boolean action02() {
boolean result = action00();
if (!result){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return result;
}
private boolean action00() {
String result = true;
try {
System.out.println(1/0);
} catch (Exception e) {
result = false;
}
return result;
}
初級 202925
初級 203221
初級 202629
初級 203743