Spring事务
什么是事务
事务是逻辑上的一组操作,要么都执行,要么都不执行
例子:银行转账
小明给小红转账1000块,转账会涉及到两个操作,小明的余额减少1000,小红的余额增加1000,如果在这两个操作之间出现错误或者系统崩溃网络故障,导致其中一个操作失败了,如小明余额减少,但是小红的余额没有增加,这样就不对了。
事务就是保证这两个操作要么都成功,要么都失败
事务的特性ACID
A原子性
- 一个事务中的所有操作,要么全部成功要么全部失败,不会结束在中间的某个环节,事务在执行的过程中如果发生错误,就会回滚rollback到事务开始前的状态,就像这个事务从来没有执行过一样。即事务不可分割不可约简
C一致性
- 在事务开始之前和结束以后,数据库的完整性没有被破坏,这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等
I隔离性
- 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括未提交读,提交读,可重复读,串行化
D持久性
- 事务处理结束后,对数据的修改就是永久的,即时系统故障也不会丢失
Spring对事务的支持
程序是否支持事务首先取决于数据库,使用MySQL的话,如果引擎选择的是innodb则支持事务操作,如果使用的是myisam引擎,则不支持事务
Spring支持两者方式的事务管理
-
编程式事务
- 通过TransactionTemplate或者TransactionManager手动管理事务,实际应用中很少使用
-
声明式事务
- 代码侵入性最小,实际通过AOP实现
@Transactional注解使用
@Transactional的作用范围
- 方法:推荐将注解使用于方法上,不过该注解只能应用到public方法上,否则不生效
- 类:如果注解使用在类上的话,表明该注解对该类中的所有public方法都生效
- 接口:不推荐在接口上使用