接 Spring 事务管理-1
1--在Spring中编写事务
public void method(){
transactionTemplate.execute(
new TransactionCallback() {
public Object doInTransaction(TransactionStatus ts) {
try {
...........
}catch (Exception e) {
ts.setRollbackOnly();
}
return null;
}
}
);
}
2--Spring声明式事务
spring里声明式事务是用事务参数来定义的。一个事务参数就是对事务策略应该如何应用到某个方法的一段描述。虽然spring提供了几种声明事务的机制,但是它们都是依靠5个参数
来控制如何管理事务策略。
<!-- 配置事务属性 -->
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION,ISOLATION(可选),readOnly(可选),-Exception,+Exception(可选)</prop>
</props>
</property>
1,事务的控制只能做到方法的级别。
2,所有的事务策略都是依靠5个参数来控制。
下面看看这5个参数
第一个 PROPAGATION
--1 mandatory
--2 nested
--3 never 多用于测试
--4 not_supported 多用于只读
--5 required 最常用
--6 required_new
--7 supports
(就像启动多个 pl/sql 一样)
第二个 Isolation(隔离级别)
1 隔离级别定义一个事务可能受其他并发事务活动影响的程度
2 也可以想象为那个事务对于事务处理数据的自私程度
为什么要用隔离级别,因为并发导致了很多问题:
问题一Dirty read(脏读) :--脏读发生在一个事务读取了被另一个事务改写但尚未提交的数据--如果这些在稍后被回滚了,那么第一个事务读取的数据就会是无效的
这发生在两个事务当中,而oracle自身的事务默认隔离级别是read committed
并发的话,这种情况在oracle默认的隔离级别应该不会发生
(有个问题,oracle的隔离级别有几种,spring事务的隔离级别有5种,怎么对应起来呢?难道 oracle隔离级别+锁机制 == spring 事务隔离级别 (spring的隔离级别多于oracle的隔离级别)oracle的隔离级别read Committed,serializable与锁又有什么关系,有时间看下悲观锁和乐观锁
oracle的serializable
1: 事务 1 serializable ,事务 2 readCommitted 事务2更新数据1未提交,事务1更新数据1处在等待状态
如果事务2提交则事务1抱错无法连续访问事务边界
如果事务2回滚则事务1更新操作可以执行
2: 事务1 serializable, 事务2 插入一条数据未提交,事务1可以进行插入操作
事务2提交,事务1不能读取到事务2插入的数据。
说明serializable把那一行数据琐住了,如果行数据更改了,那么该事务就不能进行更改而readOnly事务可以进行更改
并发更新一条数据所采取的解决方案:
1: 对事务采取serializable隔离机制
2: 程序控制:多添加一个字段 例如加version字段每更新一次做+1的操作,每次更新的时候都进行比较也可以加日期字段,那就要取到ms了。)
问题二Nonrepeatable read(不可重复读)
一个事务里面两次查询的结果都不同,由于另一并发事务在两次查询之间更新了数据(更新)
问题三 Phantom reads (幻读)
当一个事务读取几行记录后,另一个并发事务插入了一些记录时,幻读就发生了,在后来的查询中,第一个事务就会发现一些原来没有的记录(插入)
为了解决这些问题引入的隔离机制
1--default 使用后端数据库默认的隔离级别 oracle好象有两种,read committed 和 serializable
问阿南:oracle数据库的隔离级别
2--read_uncommitted 允许读取尚未提交的数据,可能导致脏读,幻读或不可重复读
3--read_committed 允许从已经提交的并发事务读取,可防止脏读,但幻读和不可重复读仍可能发生
4--repeatable_read 对相同字段多次读取是一样的,除非数据被当前事务本身改变,可防止脏读和不可重复读,但有可能发生欢读
5--serializable 完全服从ACID的隔离级别,确保不发生脏读,不可重复读和幻读,这在所以隔离级别中也是最慢的,因为它通常
是通过完全琐定当前事务所涉及的数据表来完成。
第三个 只读
如果一个事务只对后端数据库执行读操作,那么该数据库就可能利用那个事务的只读特性,采取某些优化措施。
通过把一个事务声明为只读,可以给后端数据库一个机会来应用那些它认为合适的优化措施。
由于只读的优化措施是在一个事务启动由后端数据库实施的,因此,对于那些具有可能启动一个新事物的传播行为的
方法来说,将事务声明为只读才有意义。
此外,如果正在使用hibernate作为持久化机制,那么把一个事务声明为只读,将使Hibernate的flush模式被设置为
FLUSH_NEVER,这就告诉Hibernate避免和数据库进行不必要的对象同步,从而把所有的更新延迟到事务的结束。
第四个 事务超时
可以设置在特定数秒后事务如果没有提交的话让他回滚
回滚规则
在默认设置下:事务只在出现运行异常(runtime exception)时回滚,而在出现受阻异常(checked exception)时不回滚
在控制狂的设置下,就会变化的。
容器启动事务:
1--insert一条数据
2--commit;
3--insert一条数据
4--insert
容器提交事务
1--不管发生了什么,1只有没错,1-insert永远插入
2--如果三或者四发生了运行异常并且没有捕捉,则三四都回滚
3--如果三或者四发生了运行异常且捕捉了,则若发生异常后面的全部回滚,发生异常前面的不回滚(注意:捕捉了!!)
如果第三条语句出现问题,并且异常被捕捉到了
则1--insert一条数据提交成功 ,commit 之后
如果没有捕获到或者说没有做catch的操作,
//只是在方法签名上做了throws动作,那么插入失败。
则3--insert
这是我在ibatis情况下测试的,自己借助ibatis手动控制事务,
如果事务交给了spring容器管理,
会不会在 3-insert 处发生异常进行全部回滚。
1,经过测试不论发生什么情况:1都会执行,并插入到数据库中去。
sql异常 RuntimeException 捕获不到的,所以XX系统异常处理有问题
分享到:
相关推荐
- `spring-tx-5.2.6.RELEASE.jar`:事务管理服务,支持编程式和声明式事务处理。 - `spring-web-5.2.6.RELEASE.jar` 和 `spring-webmvc-5.2.6.RELEASE.jar`:Web相关的模块,分别对应基础Web支持和MVC框架。 每个...
在Spring中,当一个类没有实现接口时,Spring会使用CGLIB来创建代理对象,以便在不修改原有代码的情况下,为对象添加额外的功能,如事务管理、性能监控等。CGLIB的repack版本是对原始CGLIB库的重新打包,目的是为了...
《深入解析Spring TX 5.0.0:构建高效事务管理》 在Java开发领域,Spring框架以其强大的功能和灵活性而备受青睐。其中,Spring TX模块是Spring框架的重要组成部分,专注于提供事务管理服务。本文将深入探讨Spring ...
10. **spring-tx-3.2.0.RELEASE.jar**:事务管理模块提供了编程和声明式的事务管理,支持JTA(Java Transaction API)和本地事务。这使得在Spring应用中管理事务变得容易。 这组Spring 3.2.0库的完整集合,为开发者...
通过这种方式,Spring能够注入切面逻辑,比如日志记录、事务管理等,即使在不修改原有代码的情况下也能实现扩展功能。 其次,`spring-objenesis-repack-2.4.jar`是Objenesis库的一个版本,Objenesis是一个用于创建...
2. 事务管理:确保一组数据库操作作为原子操作进行,如果出现异常则全部回滚。 3. 性能监控:统计方法的执行时间,用于性能分析。 4. 安全控制:在方法调用前检查权限。 总结起来,"spring-aop-jar"涉及了Spring...
3. **Spring事务管理**:插件允许Struts2的Action方法直接参与到Spring的事务管理中,无需关心事务的开启和提交。 4. **AOP集成**:结合Spring的AOP能力,可以为Struts2的Action提供切面增强,如性能监控、日志记录...
在事务管理方面,Spring 2.5进一步完善了声明式事务管理,允许开发者通过注解或XML配置来定义事务边界,减少了手动处理事务的复杂性。此外,对JDBC、Hibernate、JPA等多种持久层技术的集成,使Spring成为了数据库...
Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...
首先,了解Spring事务管理的基本概念。在多线程环境中,事务管理是至关重要的,它负责确保一组数据库操作要么全部成功,要么全部失败。Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。声明式...
5. **spring-tx**:支持声明式事务管理,使得事务管理可以在不修改业务代码的情况下进行。 6. **spring-web**和**spring-webmvc**:这两个模块是Spring与Web应用的接口,前者提供HTTP Servlet的集成,后者则是...
5. **AOP(面向切面编程)**: AOP是Spring框架的重要特性之一,允许开发者将关注点分离,如日志记录、事务管理等,从业务逻辑中解耦。Objenesis和CGLIB在这里起到了代理生成的作用,使得切面能够在不修改目标类的...
而Spring框架则是一个全面的企业级应用开发框架,除了提供IoC和DI外,还包括事务管理、AOP(面向切面编程)、数据访问和Web服务等众多功能。 在Struts2中引入Spring插件,可以将Struts2的动作类(Action)声明为...
通过阅读文档,开发者可以深入了解Spring MVC、数据访问、事务管理、测试等模块的使用方法。 "spring-framework-4.3.18.RELEASE-schema.zip"文件提供了Spring配置文件所使用的XML架构定义。这些架构文件定义了...
2. **事务管理(Transaction Management)**:Spring 提供了强大的事务管理功能,能够控制多个数据库操作是否作为一个事务进行。整合Struts 2 和Spring 后,我们可以在Spring 配置文件中定义事务规则,并让Spring ...
在0.9版本中,Spring Modules可能已经包含了对Spring核心的扩展,比如AOP(面向切面编程)的增强,提供了一些预定义的切面,便于处理常见的企业级问题,如日志记录、事务管理等。同时,它可能还提供了对Spring IoC...
- AOP允许开发者定义“方面”,这些方面封装了横切关注点,如日志记录、事务管理等。Spring AOP支持使用代理模式实现切面,包括基于类的代理和基于JDK动态代理。 4. **MVC框架**: - Spring MVC是Spring ...
4. **事务支持**:Spring Data Redis允许开发者使用`RedisTransactionManager`来管理Redis的事务,提供了与传统关系型数据库相似的事务操作能力,如BEGIN、COMMIT、ROLLBACK等。 5. **持久化策略**:Spring Data ...
1. **JPA 整合**:Spring Data JPA 提供了与 JPA 规范的无缝集成,包括实体管理、事务管理和数据源配置。 2. **EntityManager 和 Repository**:Spring Data JPA 封装了 `EntityManager` 和 `EntityTransaction`,...
5. **事务管理**:Spring 提供了统一的事务管理接口,可以管理数据库事务以及基于JMS的消息事务。3.2.0版本提供了更灵活的编程和声明式事务管理策略。 6. **消息支持**:Spring 对Java消息服务(JMS)提供全面支持...