更新时间:2022-03-23 10:10:32 来源:极悦 浏览2275次
在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天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习