一、Spring事务的相关知识
1、事务是指一系列独立的操作,但在概念上具有原子性。 比如转账:A账号-100,
B账号+100,完成。这两个操作独立是没问题的。 但在逻辑上,要么全部完成,要么一起失败。
1)jdbc事务:每个Connection都带有一个事务,只是默认被设置为自动提交。一个连接可以有多个事务。对于JDBC,只有在同一个连接内,才有讨论是否提交的前提。
2)Hibernate事务:本质上也是使用JDBC来处理事务。但是不是直接操作,而是使用Session来操作事务。Session.getTranction();
####事务应该要在service层(也可以叫事务层)进行控制。
为什么用Spring来进行事务控制?
如果要手动进行控制事务的话,对于JDBC,service层需要Connection;对于Hibernate,serivice层需要
Session。若一个项目要实现JDBC和Hibernate或其他的互换,我们要做Service层修改很多东西;而且对于Service层来说,他
应该关心的不应该是这些,而是业务逻辑。因此,首先手动控制不能实现组件的替换,其次这些API也不应该出现在service层,但是Spring的
IOC很好的解决了这样的问题。
2、JavaEE传统事务有两种策略:全局事务和局部事务。全局事务由应用服务器管理,需要底层服务器JTA支持(如WebLogic、JBoss等)。局部事务和底层采用的持久化技术有关:当采用JDBC持久化技术时,需要使用Connetion对象来操作事务;而采用Hibernate持久化技术时,需要使用Session对象来操作事务。
全局事务可以跨多个事务性的资源(典型例子是关系数据库和消息队列);使用局部事务,应用服务器不需要参与事务管理,因此不能保证跨多个事务性资源的事务的正确性。当然,实际上大部分应用都使用单一事务性的资源。
Spring事务策略是通过PlatformTransactionManager接口体现的,该接口是Spring事务策略的核心,是一个与任何事务策略分离的接口,随着底层不同事务策略的切换,应用必须采用不同的实现类。结合Spring的IoC容器,可以向该接口注入相关的平台特性。
3、Spring的事务管理,主要有两种方式实现,一种是在代码中编写(编程式事务管理),一种是声明式事务(又可分为AOP式事务管理和注解式事务管理)。在代码中编写要更加细粒度,而很多时候我们只需要简单的事务处理,那就可以用声明式事务。
Spring的事务管理器:
事务管理器实现
目标
org.springframework.jdbc.datasource.DataSourceTransactionManager
在JDBC DataSource中管理事务
(须注入数据源datasource
Bean参数)
org.springframework