没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
15页
什么是Spring事务传播机制 Spring事务传播机制是指在多个事务操作发生时,如何管理这些操作之间的事务关系。Spring事务传播机制可以通过Propagation枚举类中的不同值来指定,共包括七种不同的传播行为。具体来说,Spring事务传播机制包括以下七种: REQUIRED:如果当前没有事务,则创建一个新的事务;如果当前已经存在事务,则加入该事务。这是默认的传播行为。 SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式执行。 MANDATORY:必须在一个已存在的事务中执行,否则就抛出TransactionRequiredException异常。 REQUIRES_NEW:创建一个新的事务,并在该事务中执行;如果当前存在事务,则将当前事务挂起。 NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则将当前事务挂起。 NEVER:以非事务方式执行操作,如果当前存在事务,则抛出IllegalTransactionStateException异常。NESTED:如果当前存在事务,则在嵌套事务中执行;如果当前没有事务,则创建一个新事务
资源推荐
资源详情
资源评论
Spring 是一个 Java 开源框架,是为了解决企业应用程序开发复杂性由 Rod Johnson 创建
的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时
为 J2EE 应用程序开发提供集成的框架。Spring 使用基本的 JavaBean 来完成以前只可能
由 EJB 完成的事情。然而,Spring 的用途不仅限于服务器端的开发。从简单性、可测试性
和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。
Spring 声明式事务让我们从复杂的事务处理中得到解脱,使得我们再也不必去处理获得连
接、关闭连接、事务提交和回滚等这些操作,再也无需我们在与事务相关的方法中处理大量
的 try…catch…finally 代码。
我们在使用 Spring 声明式事务时,有一个非常重要的概念就是事务属性。事务属性通常由
事务的传播行为、事务的隔离级别、事务的超时值、事务只读标志组成。我们在进行事务划
分时,需要进行事务定义,也就是配置事务的属性。
Spring 在 TransactionDefinition 接口中定义这些属性,以供 PlatfromTransactionManager
(github)使用,PlatfromTransactionManager 是 spring 事务管理的核心接口。
TransactionDefinition.java
(spring-tx/src/main/java/org/springframework/transaction/TransactionDefinition.java,
github)
[java] view plaincopy
1. public interface TransactionDefinition {
2. int getPropagationBehavior();
3. int getIsolationLevel();
4. int getTimeout();
5. boolean isReadOnly();
6. }
1) getPropagationBehavior(): 返回事务的传播行为,由是否有一个活动的事务来决定一
个事务调用。
2) getTimeout(): 它返回事务必须在多少秒内完成。
3) isReadOnly(): 事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务是
只读的。
4) getIsolationLevel(): 返回事务的隔离级别,事务管理器根据它来控制另外一个事务可
以看到本事务内的哪些数据。
在 TransactionDefinition 接口中,定义了五个不同的事务隔离级别 :
1) ISOLATION_DEFAULT
这是一个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别.
另外四个与 JDBC 的隔离级别相对应
2) ISOLATION_READ_UNCOMMITTED
这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离
级别会产生脏读,不可重复读和幻像读。
例如:
Mary 的原工资为 1000,财务人员将 Mary 的工资改为了 8000,但未提交事务
1. Connection con1 = getConnection();
2. con.setAutoCommit(false);
3. update employee set salary = 8000 where empId ="Mary";
与此同时,Mary 正在读取自己的工资
1. Connection con2 = getConnection();
2. select salary from employee where empId ="Mary";
3. con2.commit();
Mary 发现自己的工资变为了 8000,欢天喜地!
而财务发现操作有误,而回滚了事务,Mary 的工资又变为了 1000
1. //con1
2. con1.rollback();
像这样,Mary 记取的工资数 8000 是一个脏数据。
ISOLATION_READ_COMMITTED 保证一个事务修改的数据提交后才能被另外一个事务读
取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但
是可能会出现不可重复读和幻像读。
ISOLATION_REPEATABLE_READ 这种事务隔离级别可以防止脏读,不可重复读。但是可
能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下
面的情况产生(不可重复读)。
在事务 1 中,Mary 读取了自己的工资为 1000,操作并没有完成
1. con1 = getConnection();
2. select salary from employee empId ="Mary";
在事务 2 中,这时财务人员修改了 Mary 的工资为 2000,并提交了事务.
1. con2 = getConnection();
2. update employee set salary = 2000;
3. con2.commit();
在事务 1 中,Mary 再次读取自己的工资时,工资变为了 2000
1. //con1
2. select salary from employee empId ="Mary";
在一个事务中前后两次读取的结果并不致,导致了不可重复读。
使用 ISOLATION_REPEATABLE_READ 可以避免这种情况发生。
ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为
顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。
目前工资为 1000 的员工有 10 人。
事务 1,读取所有工资为 1000 的员工。
1. con1 = getConnection();
2. Select * from employee where salary =1000;
共读取 10 条记录
这时另一个事务向 employee 表插入了一条员工记录,工资也为 1000
1. con2 = getConnection();
2. Insert into employee(empId,salary) values("Lili",1000);
3. con2.commit();
事务 1 再次读取所有工资为 1000 的员工
剩余14页未读,继续阅读
资源评论
祈祷平安,加油
- 粉丝: 564
- 资源: 32
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功