一、事务失效
1.@Transactional作用在非public上
@Transactionalvoid transferAccounts(){adminDao.sub();System.out.println(10/0);adminDao.add();}
只执行sub()
2.异常被try catch捕获
@Transactionalpublic void transferAccounts(){adminDao.sub();try {System.out.println(10/0);}catch (Exception e){}adminDao.add();}
程序以为没有异常,将会都执行
3.出现编译期异常
@Transactionalpublic 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);}