Spring事务管理
来源:互联网 发布:精品营销软件 编辑:程序博客网 时间:2024/06/06 03:44
事务的API介绍
一、Spring事务管理包括三个接口
PlatformTransactionManager - 平台事务管理器,真正用来管理事务的接口,包含事务的提交,回滚等信息
TransactionDefinition - 事务定义信息(隔离级别、传播行为、是否超时、设置只读)
TransactionStatus - 事务具体的运行状态(是否已经提交,是否有保存点,是不是一个新的事务等等这些状态)
关系:
首先会根据TransactionDefinition事务定义的信息(比如定义了什么样的隔离级别,定义什么样的传播行为),由PlatformTransactionManager对事务进行管理,进行事务管理的过程中,事务会产生一些相应的状态,这些状态在TransactionStatus中
二、PlatformTransactionManager
Spring根据不同的持久化框架提供不同 PlatformTransactionManager接口实现
1. org.springframework.jdbc.datasource.DataSourceTransactionManager
使用Spring JDBC 或iBatis进行持久化数据时使用
2. org.springframework.orm.hibernate3.HibernateTransactionManager
使用Hibernate3.0版本进行持久化数据时使用
三、TransactionDefinition
1.事务隔离级别
不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同
幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录
事务隔离级别(四种):
DEFAULT 使用后端数据库默认的隔离级别(Spring中的选择项)
READ_UNCOMMITED 允许你读取还未提交的但是改变了的数据。可能导致脏读,幻读,不可重复读
READ_COMMITED 允许在并发事务已经提交后读取。可防止脏读,但是幻读,不可重复读仍可发生
REPEATABLE_READ 对于相同的字段的多次读取是一致的,除非数据被事务本身改变。可防止脏读,不可重复读,但幻读仍可能发生。
SERIALIZABLE 完全服从ACID的隔离级别,确保不会发生脏,幻,不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的
Mysql默认的隔离级别 REPEATABLE_READ
Oracle默认的隔离级别 READ_COMMITED
2.事务的传播行为 - 解决业务层的方法之间的相互调用的问题(在调用方法的过程中,事务是如何传递的)
事务的传播行为有七种,又分为三类:
第一类共同点:如果 A 方法中有事务,则调用 B 方法时就用该事务,即:A和B方法在同一个事务中。
PROPAGATION_REQUIRED:如果 A 方法中没有事务,则调用 B 方法时就创建一个新的事务,即:A和B方法在同一个事务中。
PROPAGATION_SUPPORTS:如果 A 方法中没有事务,则调用 B 方法时就不使用该事务。
PROPAGATION_MANDATORY:如果 A 方法中没有事务,则调用 B 方法时就抛出异常。
第二类共同点:A 方法和 B 方法不在同一个事务里面。
PROPAGATION_REQUIRES_NEW:如果 A 方法中有事务,则挂起并新建一个事务给 B 方法。
PROPAGATION_NOT_SUPPORTED:如果 A 方法中有事务,则挂起。
PROPAGATION_NEVER:如果 A 方法中有事务,则报异常。
第三类:如果 A 方法有的事务执行完,设置一个保存点,如果 B 方法中事务执行失败,可以滚回保存点或初始状态。
PROPAGATION_NESTED :如果当前事务存在,则嵌套事务执行
重点的三种:PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW, PROPAGATION_NESTED
四、TransactionStatus
该接口定义了一组方法,用来获取或判断事务的相应状态信息
一、Spring事务管理包括三个接口
PlatformTransactionManager - 平台事务管理器,真正用来管理事务的接口,包含事务的提交,回滚等信息
TransactionDefinition - 事务定义信息(隔离级别、传播行为、是否超时、设置只读)
TransactionStatus - 事务具体的运行状态(是否已经提交,是否有保存点,是不是一个新的事务等等这些状态)
关系:
首先会根据TransactionDefinition事务定义的信息(比如定义了什么样的隔离级别,定义什么样的传播行为),由PlatformTransactionManager对事务进行管理,进行事务管理的过程中,事务会产生一些相应的状态,这些状态在TransactionStatus中
二、PlatformTransactionManager
Spring根据不同的持久化框架提供不同 PlatformTransactionManager接口实现
1. org.springframework.jdbc.datasource.DataSourceTransactionManager
使用Spring JDBC 或iBatis进行持久化数据时使用
2. org.springframework.orm.hibernate3.HibernateTransactionManager
使用Hibernate3.0版本进行持久化数据时使用
三、TransactionDefinition
1.事务隔离级别
作用:为了解决脏读、不可重复读、幻读等安全问题
不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同
幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录
事务隔离级别(四种):
DEFAULT 使用后端数据库默认的隔离级别(Spring中的选择项)
READ_UNCOMMITED 允许你读取还未提交的但是改变了的数据。可能导致脏读,幻读,不可重复读
READ_COMMITED 允许在并发事务已经提交后读取。可防止脏读,但是幻读,不可重复读仍可发生
REPEATABLE_READ 对于相同的字段的多次读取是一致的,除非数据被事务本身改变。可防止脏读,不可重复读,但幻读仍可能发生。
SERIALIZABLE 完全服从ACID的隔离级别,确保不会发生脏,幻,不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的
Mysql默认的隔离级别 REPEATABLE_READ
Oracle默认的隔离级别 READ_COMMITED
2.事务的传播行为 - 解决业务层的方法之间的相互调用的问题(在调用方法的过程中,事务是如何传递的)
事务的传播行为有七种,又分为三类:
第一类共同点:如果 A 方法中有事务,则调用 B 方法时就用该事务,即:A和B方法在同一个事务中。
PROPAGATION_REQUIRED:如果 A 方法中没有事务,则调用 B 方法时就创建一个新的事务,即:A和B方法在同一个事务中。
PROPAGATION_SUPPORTS:如果 A 方法中没有事务,则调用 B 方法时就不使用该事务。
PROPAGATION_MANDATORY:如果 A 方法中没有事务,则调用 B 方法时就抛出异常。
第二类共同点:A 方法和 B 方法不在同一个事务里面。
PROPAGATION_REQUIRES_NEW:如果 A 方法中有事务,则挂起并新建一个事务给 B 方法。
PROPAGATION_NOT_SUPPORTED:如果 A 方法中有事务,则挂起。
PROPAGATION_NEVER:如果 A 方法中有事务,则报异常。
第三类:如果 A 方法有的事务执行完,设置一个保存点,如果 B 方法中事务执行失败,可以滚回保存点或初始状态。
PROPAGATION_NESTED :如果当前事务存在,则嵌套事务执行
重点的三种:PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW, PROPAGATION_NESTED
四、TransactionStatus
该接口定义了一组方法,用来获取或判断事务的相应状态信息
0 0
- 事务管理之Spring事务管理
- Spring事务管理
- spring事务管理
- Spring事务管理
- Spring事务管理
- Spring事务管理
- Spring事务管理
- Spring事务管理
- Spring 事务管理
- Spring事务管理
- spring 事务管理
- spring 事务管理
- spring 事务管理
- spring事务管理
- Spring 事务管理
- Spring事务管理
- spring事务管理
- spring 事务管理
- Java 语言的几个缺陷之: equals() 比较字符串
- C语言——_beginthreadex函数创建子线程
- js 关于笛卡尔乘积的运用
- Understanding LSTM Networks
- 爬虫保存图片
- Spring事务管理
- 基于js 的数组去重算法
- 20170203C语言提升05_编译
- JavaScript表单验证
- 管理系统UI之四:使用全屏沉浸模式(Using Immersive Full-Screen Mode)
- 机器学习 by ANG(一)
- ecplise中启动Tomcat错误.not found on the java.library.path解决
- c:foreach 循环List<Map> map中是一个list<Object>
- MySQL存储过程及触发器