一、事务失效
1.@Transactional作用在非public上
@Transactional
void transferAccounts(){
adminDao.sub();
System.out.println(10/0);
adminDao.add();
}
只执行sub()
2.异常被try catch捕获
@Transactional
public void transferAccounts(){
adminDao.sub();
try {
System.out.println(10/0);
}catch (Exception e){
}
adminDao.add();
}
程序以为没有异常,将会都执行
3.出现编译期异常
@Transactional
public void transferAccounts() throws UnsupportedEncodingException {
adminDao.sub();
"a".getBytes("utf-9");
adminDao.add();
}
4.事务传播行为设置错误
5.数据库引擎不支持
数据库引擎为InnoDB时,支持事务
数据库引擎为MyISAM时,不支持事务
6.同一事务,使用非代理对象
二、事务传播行为
事务传播行为:当一个事务方法被另一个事务方法调用时,该事务方法如何执行。
Spring 定义的七种传播行为
1. Propagation.REQUIRED
例如:在A事务中添加B事务
A中没有事务,B方法自己创建事务,B异常不影响A
A中有事务,调用B方法 ,B方法会加入A事务中,任意一方出现异常,都不会执行。
2. Propagation.REQUIRES_NEW
A中没有事务,B方法自己创建事务,B异常不影响A
A中有事务,调用B方法 ,B方法会创建事务,将A事务挂起,A出现异常不影响B
例如:A事务
B事务
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveLog(){
logDao.saveLog();
//System.out.println(10/0);
}