数据库引擎不支持事务
mysql5.5.5 默认存储引擎是InnoDB(支持事务),之前是MyISAM(不支持事务操作)
没有被 Spring 管理
当前类如果不被spring管理(例如不加@service),那么事务就失效了
方法不是 public 的
@Transactional 只能用于public方法上,如果要用在非public方法上,开启AspectJ代理模式
自身调用问题
事务开启必须在本类的开始(也就是说外部调用事务才会生效,不可以本类的方法调用本类的事务,因为这样的话没有经过spring的代理类)
数据源没有配置事务管理器
spring一般使用TransactionMananger(事务管理器)进行管理,可以通过Spring的注入来完成此功能。
JDBC中是通过Connection对象进行事务管理,默认是自动提交事务,可以手工将自动提交关闭,通过commit方法进行提交,rollback方法进行回滚,如果不提交,则数据不会真正的插入到数据库中。
Hibernate中是通过Transaction进行事务管理,处理方法与JDBC中类似。
不支持事务
4种事务隔离级别由低往高:
READ UNCOMMITTED,读取未提交的数据(脏读)
READ COMMITTED,读取已提交的数据,这也是oracle默认的隔离级别(不可重复读)
REPEATABLE READ,可重复读取数据,这也是Mysql默认的隔离级别(幻读)
SERIALIZABLE,可串行化读
7种事务传播机制:[Propagation.xxx]
REQUIRED:如果当前方法有事务则加入事务,没有则创建一个事务
NOT_SUPPORTED:不支持事务,如果当前有事务则挂起事务运行
REQUIREDS_NEW:新建一个事务并在这个事务中运行,如果当前存在事务就把当前事务挂起。新建的事务的提交与回滚一挂起事务没有联系,不会影响挂起事务的操作
MANDATORY:强制当前方法使用事务运行,如果当前没有事务则抛出异常
NEVER:当前方法不能存在事务,即非事务状态运行,如果存在事务则抛出异常
SUPPORTS:支持当前事务,如果当前没事务也支持非事务状态运行
NESTED:如果当前存在事务,则在嵌套事务内执行。嵌套事务的提交与回滚与父事务没有任务关系,反之,当父事务提交嵌套事务也一起提交,父事务回滚会也回滚嵌套事务的。
如果当前没有事务,则新建一个事务运行,这时候则与PROPAGATION_REQUIRED场景一致.
异常被吃了
事务内部出现异常进行捕获,事务无法回滚
异常类型错误
方法内部出现异常进行捕获,捕获之后再抛出异常,事务默认回滚的是:RuntimeException,触发其他异常的回滚,需要在注解上进行配置【@Transactional(rollbackFor = Exception.class】,仅限于Throwable异常类及其子类