1. aspectJ AOP实现事务
2. 事务代理工厂Bean实现事务
3. 注解方式实现事务
(1)说一下事务
事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。
(2)说一下事务传播的特性(ACID)
原子性:指事务包含的所有操作要么全部成功,要么全部失败。因此事务的操作如果成功就必须完全应 用到数据库,失败也不能对数据库有任何影响。
一致性:指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前 和执行之后都必须处于一致性状态。比如转账操作:a和b的账户共200元,那么无论他们之间怎么互相 转账,这个钱的总额依然是200.
隔离性:指当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作所 干扰,多个并发事务之间要互相隔离。
持久性:指一个事务一旦提交,那么对于数据库的修改是永久性的,即便是在数据库系统遇到故障的情 况下也不会丢失提交事务的操作。
(3)说一下事务隔离性
事务隔离级别指的是一个事务对数据的修改与另一个并行的事务的隔离程度,当多个事务同时访问相同 数据时,如果没有采取必要的隔离机制,就可能发生以下问题:
脏读:一个事务读到另一个事务还未提交的更新数据
幻读:当一个事务对一个表的所有数据行都进行了修改,同时另一个事务进行了插入操作,那么第一个 事务的用户就会发现表中出现了一条未被修改过的新插入的数据,就造成了幻读。
不可重复读:在同一事务中先后执行了两条相同的查询语句,但由于其他事务操作了该查询语句相关的 数据,导致两次查询的结果不相同,就是不可重复读
(4)说一下spring事务的隔离级别
隔离级别描述 DEFAULT 使用数据库本身使用的隔离级别,ORACLE(读已提交) MySQL(可重复读) READ_UNCOMITTED 读未提交(脏读)最低的隔离级别,一切皆有可能。 READ_COMMITED 读已提交,ORACLE默认隔离级别,有幻读以及不可重复读风险。 REPEATABLE_READ 可重复读,解决不可重复读的隔离级别,但还是有幻读风险。 SERLALIZABLE 串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后 才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了
编程式事务管理:通过代码编程的方式管理事务,灵活性高,但难维护
声明式事务管理:可以将业务代码和事务管理分离,只需要使用注解或xml配置来管理事务
(1)实现事务的三种方式
1. 基于接口:
1. 基于TransactionIntercptor的声明式事务:spring声明式事务的基础,不建议使用 2. 基于TransactionProxyFactoryBean的声明式事务:第一种的改进,简化了配置文件的书 写,不建议使用
2. 基于xml配置 基于和命名空间的声明式事务管理,与SpringAop结合紧密,可以充分利用切点表达式,使事务管 理更加灵活,推荐使用
3. 基于注解配置 基于@Transactional的全注解方式,非常简化了事务管理,只需要给需要实施事务管理的方法或 者类上使用@Transactional注解指定事务规则即可实现事务管理,推荐使用
事务的传播性质指的是当一个事务方法被另一个事务方法调用时,这个事务该如何进行。
(1)Propagation.REQUIRED如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个 新的事务。
(2)Propagation.SUPPORTS:如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事 务的方式继续运行。
(3)Propagation.MANDATORY:如果当前存在事务,则加入该事务;如果当前不存在事务,则抛 出异常。
(4)Propagation.REQUIRES_NEW:重新创建一个新的事务,如果当前存在事务,延缓当前的事 务。
(5)Propagation.NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,暂停当前的事 务。
(6)Propagation.NEVER:以非事务的方式运行,如果当前存在事务,则抛出异常。
(7)Propagation.NESTED :如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务