- package org.springframework.transaction.support;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.springframework.beans.factory.InitializingBean;
- import org.springframework.transaction.PlatformTransactionManager;
- import org.springframework.transaction.TransactionDefinition;
- import org.springframework.transaction.TransactionException;
- import org.springframework.transaction.TransactionStatus;
- import org.springframework.transaction.TransactionSystemException;
- public class TransactionTemplate extends DefaultTransactionDefinition
- implements TransactionOperations, InitializingBean {
- protected final Log logger = LogFactory.getLog(getClass());
- private PlatformTransactionManager transactionManager;
- public TransactionTemplate() {
- }
- sactionTemplate(PlatformTransactionManager transactionManager) {
- this.transactionManager = transactionManager;
- }
- public TransactionTemplate(PlatformTransactionManager transactionManager,
- TransactionDefinition transactionDefinition) {
- super(transactionDefinition);
- this.transactionManager = transactionManager;
- }
- /**
- * Set the transaction management strategy to be used.
- */
- public void setTransactionManager(PlatformTransactionManager transactionManager) {
- this.transactionManager = transactionManager;
- }
- /**
- * Return the transaction management strategy to be used.
- */
- public PlatformTransactionManager getTransactionManager() {
- return this.transactionManager;
- }
- public void afterPropertiesSet() {
- if (this.transactionManager == null) {
- throw new IllegalArgumentException
- ("Property 'transactionManager' is required");
- }
- }
- public Object execute(TransactionCallback action) throws TransactionException {
- if (this.transactionManager instanceof
- CallbackPreferringPlatformTransactionManager) {
- return ((CallbackPreferringPlatformTransactionManager)
- this.transactionManager).execute(this, action);
- } else {
- TransactionStatus status = this.transactionManager.getTransaction(this);
- Object result = null;
- try {
- result = action.doInTransaction(status);
- }
- catch (RuntimeException ex) {
- // Transactional code threw application exception -> rollback
- rollbackOnException(status, ex);
- throw ex;
- }
- catch (Error err) {
- // Transactional code threw error -> rollback
- rollbackOnException(status, err);
- throw err;
- }
- this.transactionManager.commit(status);
- return result;
- }
- }
- private void rollbackOnException(TransactionStatus status, Throwable ex)
- throws TransactionException {
- logger.debug("Initiating transaction rollback on application exception", ex);
- try {
- this.transactionManager.rollback(status);
- }
- catch (TransactionSystemException ex2) {
- logger.error("Application exception overridden by rollback exception", ex);
- ex2.initApplicationException(ex);
- throw ex2;
- }
- catch (RuntimeException ex2) {
- logger.error("Application exception overridden by rollback exception", ex);
- throw ex2;
- }
- catch (Error err) {
- logger.error("Application exception overridden by rollback error", ex);
- throw err;
- }
- }
- }
- 1 、使用TransactionTemplate进行事务处理Spring进行commit和rollback)
- (1使用事务处理的类)
- import javax.sql.DataSource;
- import org.springframework.jdbc.core.*;
- import org.springframework.transaction.*;
- import org.springframework.dao.*;
- public class bookDAO{
- private DataSource dataSource;// 依赖注入 dataSource ,管理数据库
- private PlatformTransationManager transactionManager;// 依赖注入管理事务
- public void setDataSource(DataSource dataSource){
- this.dataSource=dataSource;
- }
- public void setTransactionManager(PlatformTransationManager transactionManager){
- this. transactionManager= transactionManager;
- }
- public int create(String msg){
- TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager);
- // 调用 transactionTemplate 的 execute 方法进行事务管理
- Object result= transactionTemplate.execute (
- // 这是一个回调函数,实现了 TransactionCallback 接口的 doInTransaction 方法,
- //就是在这个方法里写数据库新增数据的操作
- new TransactionCallback() {
- public Object doInTransaction(TransactionStatus status) {
- // 数据库操作代码
- return resultObject;
- }
- }
- )
- }
- }
- (2)配置文件XML)
- <beans>
- <!— 设 定dataSource -->
- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <!— 使用SQL Server 数 据 库 -->
- <property name="”driverClassName”">
- <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
- </property>
- <property name="url">
- <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>
- </property>
- <property name="”name”">
- <value>admin</value>
- </property>
- <property name="msg">
- <value>admin</value>
- </property>
- </bean>
- <!— 设定 transactionManager -->
- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource">
- <ref bean="”dataSource"/>
- </property>
- </bean>
- <!— DAO-->
- <bean id="bookDAO" class="com.bookDAO">
- <property name="dataSource">
- <ref bean="dataSource"/>
- </property>
- <property name="transactionManager">
- <ref bean="transactionManager"/>
- </property>
- </bean>
- </beans>
- 二、如果不想返回结果(resultObject),则可以用TransactionCallbackWithoutResult来实现TransactionCallback接口,代码如下:
- new TransactionCallback WithoutResult () {
- public Object doInTransaction WithoutResult (TransactionStatus status) {
- // 数据库操作代码
- }
- }
- 三、
- import javax.sql.DataSource;
- import org.springframework.jdbc.core.*;
- import org.springframework.transaction.*;
- import org.springframework.dao.*;
- public class bookDAO{
- private DataSource dataSource;// 依赖注入 dataSource ,管理数据库
- private PlatformTransationManager transactionManager;// 依赖注入管理事务
- public void setDataSource(DataSource dataSource){
- this.dataSource=dataSource;
- }
- public void setTransactionManager(PlatformTransationManager transactionManager){
- this. transactionManager= transactionManager;
- }
- public int create(String msg){
- DefaultTransactionDefinition def =new DefaultTransactionDefinition();
- TransactionStatus status=transactionManager.getTransaction(def);
- try {
- JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
- jdbcTemplate.update(“INSERT INTO book VALUES(1,’gf’,’Mastering Spring’)”);
- } catch(DataAccessException ex) {
- transactionzManager.rollback(status);
- throw ex;
- } finally {
- transactionManager.commit(status);
- }
- }
- }
相关推荐
Spring提供了两种主要的事务管理方式:声明式事务管理和编程式事务管理。本篇文章将聚焦于编程式事务管理,特别是如何通过`TransactionTemplate`进行事务控制。 1. **Spring编程式事务管理**: 编程式事务管理允许...
Spring 声明式事务和Spring 编程式事务
Spring 编程式事务与声明式事务详解 本文将详细解释 Spring 的编程式事务管理及声明式事务管理,帮助读者理清思路。 事务管理的重要性 事务管理对于企业应用至关重要。它保证了用户的每一次操作都是可靠的,即便...
本文将全面分析Spring中的编程式事务管理和声明式事务管理,旨在帮助开发者深入理解这两种事务管理方式,并在实际项目中合理选择。 **编程式事务管理** 编程式事务管理是通过代码直接控制事务的开始、提交、回滚等...
在本篇“Spring学习笔记(十五)——编程式事务例子”中,我们将深入探讨Spring框架中的编程式事务管理。在实际开发中,我们通常使用声明式事务管理,它基于AOP(面向切面编程)来简化事务处理。然而,有时为了更细...
总结来说,`Spring_tx编程式事务代码`主要涉及Spring的`TransactionTemplate`类,它是Spring事务管理的一种便捷工具,可以帮助开发者以编程的方式更加方便地控制事务的生命周期,同时保持代码的简洁和可维护性。...
在本课程"跟我学Spring3(9.3)Spring的事务之编程式事务"中,我们将深入探讨Spring框架中的事务管理机制,特别是编程式事务管理。Spring作为Java领域中的一个核心框架,其强大的事务管理能力是它的重要特性之一。...
本教程将深入探讨 Spring 的编程式事务管理和声明式事务管理,帮助你理解这两种方式的差异与应用场景。 首先,编程式事务管理依赖于编程的方式显式地控制事务的开始、提交、回滚等操作。它通过实现 `...
在Spring中,事务管理分为编程式和声明式两种方式,而声明式事务处理则是通过配置来控制事务的行为,使得代码与事务逻辑解耦,提高了代码的可读性和可维护性。 首先,我们要理解什么是事务。事务是数据库操作的一组...
总之,Spring的声明式事务管理简化了事务处理,降低了代码的复杂性,而Hibernate的编程式事务管理则提供了更多的控制。在实际项目中,根据需求选择适合的事务管理方式,Spring和Hibernate的集成则为Java开发提供了...
本篇文章将深入探讨Spring中的两种主要事务管理方式:编程式事务管理和声明式事务管理。 1. 编程式事务管理: 编程式事务管理允许开发者直接在代码中控制事务的开始、提交、回滚等操作。这种方式具有较高的灵活性,...
本教程将深入探讨如何在Spring中实现自定义事务管理器、编程式事务处理以及声明式事务`@Transactional`的使用。 首先,让我们了解事务管理的基本概念。事务是一组数据库操作,这些操作要么全部执行,要么全部回滚,...
Spring事务处理是其核心特性之一,确保了数据的一致性和完整性。本篇文章将聚焦于Spring事务处理中ThreadLocal的使用,以及如何通过源码理解和应用这个工具。 首先,了解Spring事务管理的基本概念。在多线程环境中...
首先,我们要理解Spring事务管理的两种主要方式:编程式事务管理和声明式事务管理。编程式事务管理通常通过AOP(面向切面编程)的TransactionTemplate或PlatformTransactionManager接口直接在代码中控制事务,而声明...
在本篇"Spring学习之八--Hibernate编程式事务"中,我们将探讨如何在Spring框架中使用Hibernate进行编程式事务管理。编程式事务管理是相对于声明式事务管理的一种方式,它允许开发者通过代码来显式控制事务的开始、...
Spring 中的事务处理可以分为两种方式:声明式事务处理和编程式事务处理。声明式事务处理通过 AOP 的实现,把事务管理代码作为方面封装到业务代码中,使得事务管理代码和业务代码解藕。这使得事务管理变得更加灵活...
在 Spring 中,有两种类型的事务管理:编程式事务管理和声明式事务管理。编程式事务管理使用 TransactionTemplate 或者直接使用底层的 PlatformTransactionManager。声明式事务管理有基于 tx 和 aop 名字空间的 xml ...
声明式事务是通过在方法上添加@Transactional注解来实现事务处理的,而编程式事务则是通过编写代码来实现事务处理的。 在声明式事务中,需要在方法上添加@Transactional注解,并在配置文件中开启基于注解的事务管理...
1. **编程式事务管理**:通过使用`PlatformTransactionManager`接口及其实现类(如`JdbcTemplate`或`HibernateTemplate`),开发者可以在代码中手动开始、提交、回滚事务。这种方式灵活性高,但容易导致事务控制代码...