Spring 中的TransactionTemplate

    xiaoxiao2021-03-26  29

    Spring提供的TransactionTemplate 能够以编程的方式实现事务控制,是无状态而且线程安全的

    public class TransactionTemplate extends DefaultTransactionDefinition implements TransactionOperations, InitializingBean { protected final Log logger = LogFactory.getLog(getClass()); //PlatformTransactionManager用来执行事务的提交和回滚操作。 private PlatformTransactionManager transactionManager; public TransactionTemplate() { } public TransactionTemplate(PlatformTransactionManager transactionManager) { this.transactionManager = transactionManager; } public TransactionTemplate(PlatformTransactionManager transactionManager, TransactionDefinition transactionDefinition) { super(transactionDefinition); this.transactionManager = transactionManager; } //依赖注入 public void setTransactionManager(PlatformTransactionManager transactionManager) { this.transactionManager = transactionManager; } public PlatformTransactionManager getTransactionManager() { return this.transactionManager; } @Override //执行完毕后调用 public void afterPropertiesSet() { //如果transactionManager 为空抛异常 if (this.transactionManager == null) { throw new IllegalArgumentException("Property 'transactionManager' is required"); } } @Override //进行事务处理的骨架代码,指明了事务处理的顺序 public <T> T execute(TransactionCallback<T> action) throws TransactionException { if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) { return ((CallbackPreferringPlatformTransactionManager) this.transactionManager).execute(this, action); } else { //获取事务状态 TransactionStatus status = this.transactionManager.getTransaction(this); T result; try { //在doInTransaction()进行各种数据库操作 result = action.doInTransaction(status); } catch (RuntimeException ex) { rollbackOnException(status, ex); throw ex; } catch (Error err) { rollbackOnException(status, err); throw err; } catch (Throwable ex) { rollbackOnException(status, ex); throw new UndeclaredThrowableException(ex, "TransactionCallback threw undeclared checked exception"); } //没有异常就操作成功,提交 this.transactionManager.commit(status); //返回执行doInTransaction()方法后的返回值 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; } } }

    execute()方法内的TransactionCallback参数是个接口,在这个接口内定义了doInTransaction()方法,这样的模版代码,所以我们只要实现了TransactionCallback接口,并且在doInTransaction()方法里编写具体进行的事务处理的代码就可以了,创建TransactionTemplate 的实例需要提供一个PlatformTransactionManager的实例,比如

    TransactionTemplate transactionTemplate=new TransactionTemplate(); transactionTemplate.setTransactionManager(platformTransactionManager); transactionTemplate.execute(new TransactionCallback<String>() { @Override public String doInTransaction(TransactionStatus status) { //数据库操作1 //数据库操作2 return "success"; } });
    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 设定dataSource --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- 使用SQL server数据库 --> <property name="driverClassName"> <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value> </property> <!-- 设定URL --> <property name="url"> <value>jdbc:microsoft:sqlserver://localhost:1433/mydatabase</value> </property> <!-- 设定用户名 --> <property name="name"> <value>root</value> </property> <property name="msg"> <value>123</value> </property> </bean> <!-- 设定transactionManager --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref bean="dataSource"/> </property> </bean> <bean id="helloDAO" class="transaction.HelloDAO"> <property name="dataSource"> <ref bean="dataSource"/> </property> <property name="transactionManager"> <ref bean="transactionManager"/> </property> </bean> </beans>

    HelloDAO类

    public class HelloDAO { private DataSource dataSource; private PlatformTransactionManager transactionManager; //通过依赖注入来完成管理 public DataSource getDataSource() { return dataSource; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public PlatformTransactionManager getTransactionManager() { return transactionManager; } public void setTransactionManager(PlatformTransactionManager transactionManager) { this.transactionManager = transactionManager; } //该方法进行事务处理 public int create(String msg){ DefaultTransactionDefinition def=new DefaultTransactionDefinition(); // TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager); TransactionStatus status=transactionManager.getTransaction(def); try { //使用JdbcTemplate往数据库里新增数据 JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource); jdbcTemplate.update("INSERT INTO hello VALUES(1,'gf','HELLO')"); } catch (Exception e) { transactionManager.rollback(status); throw e; }finally{ transactionManager.commit(status); } return 0; } }

    1、使用Spring预定义的DefaultTransactionDefinition ,然后通过TransactionManager的getTransaction()方法首先声明事务开始 2、如果有异常发生,则使用TransactionManager的rollback()方法进行事务回滚 3、如果成功,则执行TransactionManager的commit()方法进行事务提交

    转载请注明原文地址: https://ju.6miu.com/read-662864.html

    最新回复(0)