数据库(Mysql)异常(MySQLIntegrityConstraintViolationException:jpa save方法设置了某个字段不可为空)
1.catch处理异常: 回滚生效 报错javax.persistence.RollbackException: Transaction marked as rollbackOnly
猜测是因为:save方法的时候,事务已经被标记成回滚的状态了(rollback-only),且不能再设置为不回滚,在外层事务 try catch处理了异常,没有捕捉到异常,提交的时候是正常提交,不回滚的状态,可是save和外侧是同一个事务,回滚状态不一致,所以报错。
@Transactional(rollbackFor = Exception.class)
public String testTransactional(){
try{
dataJpa.save(new Data("test","test","test","test"));
doorCardJpa.save(new DoorCard("test","test",null));
}catch (Exception e){
//手动回滚
//TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//throw e;
}
return "";
}
2.catch抛出异常:回滚生效 报错
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'add_time' cannot be null
@Transactional(rollbackFor = Exception.class)
public String testTransactional(){
try{
dataJpa.save(new Data("test","test","test","test"));
doorCardJpa.save(new DoorCard("test","test",null));
}catch (Exception e){
//手动回滚
//TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
throw e;
}
return "";
}
3.catch手动回滚事务: 回滚生效 不报错
//手动回滚代码
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@Transactional(rollbackFor = Exception.class)
public String testTransactional(){
try{
dataJpa.save(new Data("test","test","test","test"));
doorCardJpa.save(new DoorCard("test","test",null));
}catch (Exception e){
//手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
// throw e;
}
return "";
}
程序异常:(java.lang.ArithmeticException: / by zero)
1.catch处理: 不回滚
@Transactional(rollbackFor = Exception.class)
public String testTransactional(){
try{
dataJpa.save(new Data("test","test","test","test"));
doorCardJpa.save(new DoorCard("test","test","test"));
int i = 1/0;
}catch (Exception e){
//手动回滚
//TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//throw e;
}
return "";
}
2.catch抛出异常:回滚生效 报错(正常故意报的错)
java.lang.ArithmeticException: / by zero
@Transactional(rollbackFor = Exception.class)
public String testTransactional(){
try{
dataJpa.save(new Data("test","test","test","test"));
doorCardJpa.save(new DoorCard("test","test","test"));
int i = 1/0;
}catch (Exception e){
//手动回滚
//TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
throw e;
}
return "";
}
3.catch手动回滚事务: 回滚生效 不报错
//手动回滚代码
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@Transactional(rollbackFor = Exception.class)
public String testTransactional(){
try{
dataJpa.save(new Data("test","test","test","test"));
doorCardJpa.save(new DoorCard("test","test","test"));
int i = 1/0;
}catch (Exception e){
//手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//throw e;
}
return "";
}
所以在事务中使用try catch 最好在catch中手动回滚:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
throw异常的话,throw后边的代码不会被执行。