说起事务,大家并不陌生,在学习数据库的时候已经对事务有了初步的了解,下面我们看看,spring是如何管理事务的
spring的事务管理主要就是将事务由数据访问层提升至业务层。
回忆一下什么是事务:
- 事务,就是一组操作数据库的动作集合。
- 事务是现代数据库理论中的核心概念之一。
- 如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。
- 当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交。
- 由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态。
Spring事务的隔离级别:
五个隔离级别:
- ISOLATION_DEFAULT
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别. - 另外四个与JDBC的隔离级别相对应;
- ISOLATION_READ_UNCOMMITTED这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。
这种隔离级别会产生脏读,不可重复读和幻像读。 - ISOLATION_READ_COMMITTED保证一个事务修改的数据提交后才能被另外一个事务读取。
另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。 - ISOLATION_REPEATABLE_READ这种事务隔离级别可以防止脏读,不可重复读。
但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。 - ISOLATION_SERIALIZABLE这是花费最高代价但是最可靠的事务隔离级别。
事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。 - mysql的事务默认隔离级别为可重复读
- Orcale的事务默认隔离级别为读已提交
Spring事务的七种传播行为:
-
1.PROPAGATION_REQUIRED – 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
-
2.PROPAGATION_SUPPORTS – 支持当前事务,如果当前没有事务,就以非事务方式执行。
-
3.PROPAGATION_MANDATORY – 支持当前事务,如果当前没有事务,就抛出异常。
-
4.PROPAGATION_REQUIRES_NEW – 新建事务,如果当前存在事务,把当前事务挂起。
-
5.PROPAGATION_NOT_SUPPORTED – 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
-
6.PROPAGATION_NEVER – 以非事务方式执行,如果当前存在事务,则抛出异常。
-
7.PROPAGATION_NESTED – 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
-
常用的两个事务传播属性是1和4,即PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW即必须在事务下进行
Spring事务管理的API:
- 平台事务管理接口
- 该接口常用的实现类:
- DataSourceTransactionManager 当使用JDBC或MyBatis(iBatis)连接DB,则使用该实现类进行事务管理。
- HibernateTransactionManager 当使用Hibernate连接DB,则使用该实现类进行事务管理。
- Spring的默认回滚方式:发生受查异常提交,发生运行时异常回滚。可以通过配置进行修改
- 受查异常:编译时异常,代码运行前需要进行处理的异常。
- 运行时异常:RuntimeException的子类
通过Spring管理事务的方式:
- 使用Spring的事务代理工厂Bean生成代理对象管理事务
- 使用Spring的事务管理注解管理事务
- 1.在目标方法上添加事务注解
2.在spring容器中注册事务注解驱动
- 使用AspectJ管理事务(常用)
- 1.导入aspectJ的jar包
2.引入aop约束
3.在spring容器中注册平台事务管理器
4.注册事务相关的通知
5.进行AOP配置