这篇文章将为大家详细讲解有关Spring中事务机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
成都服务器托管,创新互联提供包括服务器租用、服务器托管、带宽租用、云主机、机柜租用、主机租用托管、CDN网站加速、申请域名等业务的一体化完整服务。电话咨询:18980820575具体如下。
JAVA EE传统事务机制通常有两种事务策略:全局事务和局部事务。全局事务可以跨多个事务性资源(即数据源,典型的是数据库和消息队列),通常都需要J2EE应用服务器的管理,其底层需要服务器的JTA支持。而局部事务则与底层采用的持久化技术有关,如果底层直接使用JDBC,需要用Connection对象来操事务。如果采用Hibernate持久化技术,则需要使用session对象来操作事务。
通常的,使用JTA事务,JDBC事务及Hibernate事务的编程流程大致如下,
上图也可以看出,采用传统事务编程,程序代码必须和具体的事务策略的API耦合,如果应用需要切换一种策略,意味着需要大幅修改代码。但是如果使用Spring事务的话,就不会有这个问题了。
Spring事务机制Sring没有提供任何事务支持,它只是负责包装底层的事务,而在Spring层面,对外提供统一的编程API。Spring事务的核心是PlatformTransactionManager接口,
PlatformTransactionManager代表与具体类型无关的事务接口,可以代表任何事务,包括JDBC事务,Hibernate事务,甚至是JTA事务。
Springa事务机制是一种典型的策略模式,PlatformTransactionManager代表事务管理接口,但它并不知道到底如何管理事务,它只要求事务管理提供开始事务getTransaction(),
提交事务commit()
和回滚事务rollback()
这三个方法,但具体如何实现则交给其实现类完成。编程人员只需要在配置文件中根据具体需要使用的事务类型做配置,Spring底层就自动会使用具体的事务实现类进行事务操作,而对于程序员来说,完全不需要关心底层过程,只需要面向PlatformTransactionManager接口进行编程即可。PlatformTransactionManager接口中提供了如下方法:getTransaction(..), commit(); rollback();
这些都是与平台无关的事务操作。
getTransaction()
的完整写法为 TransactionStatus getTransaction(TransactionDefinition definiton)
这个方法用来返回一个事务对象,其中的参数TransactionDefinition 则可以为事务对象指定各种属性,通常可以指定 事务的隔离属性, 传播属性, 超时,只读 这几个属性。
Spring具体的事务管理需要在配置文件中配置好PlatformTransactionManager,下面是不同类型的事务对应的Spring配置。
JDBC数据源的局部事务管理器的配置如下,
容器管理的JTA全局事务管理器的配置如下,
对于JTA全局事务,只需要指定事务管理器的实现类JtaTransactionManager即可,Spring容器会自行从J2EE服务器获取数据源,无需显式注入进事务管理器。
基于Hibernate持久化技术的Spring局部事务配置如下,
com.entity.User org.hibernate.dialect.MySQL5InnoDBDialect update
Spring事务如果采用Hibernate策略,一般需要配置三点:数据源, sessionFactory, 事务管理器。
如果底层采用Hibernate持久层技术,而事务采用JTA全局事务时,配置如下,
com.entity.User org.hibernate.dialect.MySQL5InnoDBDialect update
这与前面的基于Hibernate的Spring事务比起来,就是将数据源换成了JNDI数据源, 将事务管理器换成了JtaTransactionManager.
对于JTA全局事务,因为需要底层应用服务器的支持,而不同应用服务器所提供的JTA全局事务可能存在细节上的差异,因此实际配置全局事务管理器时可能需要使用JtaTransactionManager的子类,例如Oracle的JavaEE应用服务器提供的OC4JJtaTransactionManager,Oracle为WebLogic提供的WebLogicJtaTransactionManager, IBM为WebSphere提供的WebSphereUowTransactionManager等。
从上面各种事务类型的Spring配置可以看出,当应用程序采用Spring事务管理时,应用程序无需与具体的事务API耦合,应用程序只需要面向PlatormTransactionManager接口编程即可,ApplicationContext会根据配置文件选择合适的事务策略实现类(即PlatormTransactionManager的实现类)。
那么在具体在Spring中如何进行事务控制编程呢,通常有两种方式,
编程式事务管理:就是直接在代码中使用PlatormTransactionManager提供的三个抽象方法进行事务流程控制。也可以在Spring容器中获取PlatormTransactionManager类型的Bean,该Bean总是PlatormTransactionManager的具体实现类的实例,具体的实现类则由ApplicationContext按照策略模式进行选择,编程人员无需关心,只需要面向接口编程即可。
声明式事务管理:这种方式不需要讲事务控制流程写入代码中,而是通过AOP的方式,完全由配置文件完成事务的织入。即XML配置文件可以为业务组件配置事务代理,事务代理为业务组件提供事务控制。现在这种方式是最好的,源码侵入性最低。
使用声明式事务管理-使用XML Schema配置事务策略当使用声明式事务时,只需要写好配置文件,配置需要事务控制的组件种类,业务组件就会在AOP机制下被织入事务控制,而编程人员不需要写任何事务管理代码,可以专注于业务组件的开发。因此通常都推荐使用声明式事务管理。
Spring的XML Schema方式提供了简洁的事务配置策略,通过命名空间 完整的Spring配置如下, NewsDaoImpl代码中,则是插入重复数据到表中, 下面是测试方法, 执行测试方法会发现抛出异常(因为有重复数据),而又因为事务控制,数据库中讲不会有数据插入。 可以看到上面例子中,通常对于XML Schema的配置中,其实就是对一个普通的Bean做了AOP配置,织入一个advice增强,而advice增强中则配置一个事务管理器,事务管理器又依赖数据源。 对于 另外,在 除了使用XML Schema的方法之外,也可以直接在方法上添加@Transaction注解,使这个方法具有事务属性。 在@Transaction中可以为事务配置各种属性(例如隔离属性, 传播属性, 超时,只读属性等等),此外,还需要在在XML配置中加入 NewsDaoImpl. 关于“Spring中事务机制的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
来配置一个事务增强处理,其中可以指定事务的各种属性(例如隔离属性, 传播属性, 超时,只读属性等等),然后通过
package com.dao.impl;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import com.dao.NewsDao;
public class NewsDaoImpl implements NewsDao {
private DataSource ds;
public void setDs(DataSource ds) {
this.ds = ds;
}
@Override
public void insert(String title, String content) {
//c3p0数据池的用法
JdbcTemplate jt = new JdbcTemplate(ds);
jt.update("insert into news_inf" + " values(100,?,?)", title, content);
jt.update("insert into news_inf" + " values(100,?,?)", title, content);
//如果没有事务控制,则第一条记录可以被插入
//如果增加事务控制,将发现第一条记录也插不进去
}
}
public static void test3() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans4JDBC.xml");
//获取事务代理Bean
NewsDao dao = (NewsDao)ctx.getBean("newsDao", NewsDao.class);
dao.insert("java编程核心思想", "轻量级Java EE开发");
System.out.println("执行完毕");
}
@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.DEFAULT, timeout=5)
@Override
public void insert(String title, String content) {
分享题目:Spring中事务机制的示例分析-创新互联
分享地址:http://chengdu.cdxwcx.cn/article/gisoo.html