事务的特性(ACID)
原子性(Atomicity):事务是最小的执行单位,不允许分割,要么全都执行,要么全不执行。
一致性(Consistency):执行事务前后,数据保持一致。
隔离性(Isolation):并发访问数据库时,一个用户的事务不应该被其他事务干扰,各并发事务之前的数据库是独立的。
持久性(Durability):一个事务提交之后,他对数据库的改变应该是持久的,即使后续数据库发生故障也不该对其造成影响。
Spring对事务的支持
1.编程式事务:通过 TransactionTemplate或者TransactionManager手动管理事务。
TransactionTemplate txTemplate = new TransactionTemplate(txManager);
txTemplate.execute(status -> {
// 业务代码
return result;
});
2.声明式事务(最常用,对代码侵入最少):通过AOP实现,使用@Transectional注解进行事务管理。
Spring事务失效场景
1.方法非public:Spring AOP只拦截public方法
2.自调用(this.xxx()):绕过了代理对象。
3.异常被catch吃掉:Spring只对从代理对象方法抛出来的异常进行回滚。
4.rollbackFor未包含受检异常:默认值回滚RuntimeException和Error。
5.数据库引擎不支持事务:MyISAM不支持事务。
6.传播行为设置错误:NOT_SUPPORTTED回吧==会把所有事物以非事务方式运行。NEVER则直接拒绝在事务中运行。
7.异步编程中调用,线程上下文已丢。