更新時間:2022-03-23 10:10:32 來源:動力節點 瀏覽2456次
在mybatis批量操作中,插入多條數據時,設置回滾,但是之前的幾條還是插入的。嘗試后
官網api上的openSession(false)可以回滾,但是用session查看還是可以的。獲取連接()。獲取自動提交 ()
將 DataSource 配置更改為 AutoCommit (false)
設置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 手動觸發事務回滾
使用第一種方法(省略數據庫操作的代碼)操作Mybatis Plus的事務,如果有異常進入catch,數據庫操作不會回滾,但是會報No transaction aspect-managed TransactionStatus in scope的錯誤改為報告。修改為第二種方法可以正常管理和回滾事務
請參閱此情況的說明:
@Transactional必須觸發aop代理才能生效,所以非公有方法不執行事務,而公有方法在該類中被引用不執行事務
方法一:
@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;
}
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習