JdbcTemplate spring 事务控制

本文详细探讨了Spring框架中的编程式事务和声明式事务管理,包括事务模板TransactionTemplate的使用,以及如何通过XML配置文件设置数据源、事务管理器和SessionFactory。此外,还介绍了在异常情况下如何进行事务回滚。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

               

编程式事务:

public static PlatformTransactionManager getTransactionManager() {  return transactionManager; } @Resource(name="dsTransactionManager"public void setTransactionManager(PlatformTransactionManager transactionManager) {  ContractManageServiceImpl.transactionManager = transactionManager; }public boolean save(String reason,String attach,String operator,String mainId,String process,String incident){  HtxxStop bo = new HtxxStop();  boolean flag = false;  try{   final CMInstance instance = new CMInstance(reason,attach,operator,mainId,process,incident,bo.getOperateTime(),bo.getRemoved());      TransactionTemplate tt = new TransactionTemplate(transactionManager);   flag = tt.execute(new TransactionCallback<Boolean>() {    boolean flag = true;    public Boolean doInTransaction(TransactionStatus status) {     try{      JdbcTemplate jt = dbUtil.getJdbcTemplate();      instance.action(jt);     }catch(Exception e){      e.printStackTrace();      status.setRollbackOnly();      flag = false;     }     return flag;    }   });    }catch(Exception e){     }  return flag; }


 /**  */package com.wonders.stpt.contractManage.instance;import org.springframework.jdbc.core.JdbcTemplate;/**  * @ClassName: CMInstance  * @Description: TODO(这里用一句话描述这个类的作用)  * @author zhoushun  * @date 2013-6-13 上午11:03:13  *   */public class CMInstance private String reason, attach, operator, mainId, process, incident,operateTime,removed; private static final String insertSql = "insert into ht_xx_stop t " +   "(t.id,t.reason,t.attach,t.operator,t.operate_time,t.main_id,t.removed)values(sys_guid(),?,?,?,?,?,?)"private static final String updateSql1 = "update ht_xx h set  h.contract_name =  h.contract_name || '<font color=''red''>(此合同异常终止)</font>' , h.flag='99',h.removed=1 where h.id = ?"private static final String updateSql2 = "update incidents i set i.processname=? ,i.status = '33' where i.processname = ?  and i.incident = ?";  public CMInstance(String reason,String attach,String operator,String mainId,String process,String incident,String operateTime,String removed){  this.reason = reason;  this.attach = attach;  this.operator = operator;  this.mainId = mainId;  this.process = process;  this.incident = incident;  this.operateTime = operateTime;  this.removed = removed; }  public void action(JdbcTemplate jt) throws Exception{  int n0 = jt.update(insertSql,new Object[]{reason,attach,operator,operateTime,mainId,removed});  int n1 = jt.update(updateSql1,new Object[]{mainId});  int n2 = jt.update(updateSql2,new Object[]{process+"(删除)",process,incident});  if(n0 > 0 && n1 > 0 && n2>0){  }else{   throw new Exception("update failed");  } }}

声明式事务

@Transactional(value = "stfb-txManager",propagation=Propagation.REQUIRED,rollbackFor=Exception.class)@Service("coccMain")

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">  <description>  Schedule Application </description> <!-- =================================================================== --> <!-- Context Define 123                                                     --> <!-- =================================================================== --> <bean id="propertyConfigurer"  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  <property name="locations">   <list>    <value>classpath:database.properties</value>   </list>  </property> </bean>   <context:component-scan base-package="com.wonders" />  <!-- =================================================================== --> <!-- Data Source Define (jdbc & jndi)                                    --> <!-- =================================================================== --> <!-- JDBC Configuration  -->  <bean id="stfb"  class="org.springframework.jdbc.datasource.DriverManagerDataSource">  <property name="driverClassName"   value="${hibernate.connection.driver_class.stfb}" />  <property name="url" value="${hibernate.connection.url.stfb}" />  <property name="username"   value="${hibernate.connection.username.stfb}" />  <property name="password"   value="${hibernate.connection.password.stfb}" /> </bean>  <bean id="stptinc"  class="org.springframework.jdbc.datasource.DriverManagerDataSource">  <property name="driverClassName"   value="${hibernate.connection.driver_class}" />  <property name="url" value="${hibernate.connection.url}" />  <property name="username"   value="${hibernate.connection.username}" />  <property name="password"   value="${hibernate.connection.password}" /> </bean>  <!-- <bean id="stptdemo"  class="org.springframework.jdbc.datasource.DriverManagerDataSource">  <property name="driverClassName"   value="${hibernate.connection.driver_class.new}" />  <property name="url" value="${hibernate.connection.url.new}" />  <property name="username"   value="${hibernate.connection.username.new}" />  <property name="password"   value="${hibernate.connection.password.new}" /> </bean>-->  <!--<bean id="stptdemo" class="org.apache.commons.dbcp.BasicDataSource">               <property name="driverClassName">                      <value>${hibernate.connection.driver_class.new}</value>               </property>               <property name="url">                      <value>${hibernate.connection.url.new}</value>               </property>               <property name="username">                      <value>${hibernate.connection.username.new}</value>               </property>               <property name="password">                      <value>${hibernate.connection.password.new}</value>               </property>               <property name="maxActive">                      <value>255</value>               </property>               <property name="maxIdle">                      <value>2</value>               </property>               <property name="maxWait">                      <value>120000</value>               </property>        </bean> -->        <bean id="stptdemo" class="com.mchange.v2.c3p0.ComboPooledDataSource"               destroy-method="close">           <property name="driverClass" value="${hibernate.connection.driver_class.new}"/>           <property name="jdbcUrl" value="${hibernate.connection.url.new}"/>           <property name="user" value="${hibernate.connection.username.new}"/>           <property name="password" value="${hibernate.connection.password.new}"/>        <!--此处继续增加c3p0属性-->  <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。-->  <property name="acquireIncrement">   <value>${jdbc.pool.c3p0.acquire_increment}</value>  </property>  <!--连接池中保留的最大连接数。-->  <property name="maxPoolSize" value="${jdbc.pool.c3p0.max_size}" />  <!--连接池中保留的最小连接数。-->  <property name="minPoolSize" value="${jdbc.pool.c3p0.min_size}" />  <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->  <property name="maxIdleTime"   value="${jdbc.pool.c3p0.max_idle_time}" />  <!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:   测试的表必须在初始数据源的时候就存在。Default: null-->  <property name="preferredTestQuery"   value="${jdbc.pool.c3p0.preferred_test_query}" />  <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->  <property name="idleConnectionTestPeriod"   value="${jdbc.pool.c3p0.idle_connection_test_period}" />  <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30    <property name="acquireRetryAttempts">30</property>-->  <!--两次连接中间隔时间,单位毫秒。Default: 1000    <property name="acquireRetryDelay">1000</property>-->  <!--连接关闭时默认将所有未提交的操作回滚。Default: false    <property name="autoCommitOnClose">false</property> -->    </bean>   <!-- JNDI Configuration    <bean id="stptinc" class="org.springframework.jndi.JndiObjectFactoryBean">   <property name="jndiName" value="jdbc/stptinc"/>   </bean>      <bean id="stptdemo" class="org.springframework.jndi.JndiObjectFactoryBean">   <property name="jndiName" value="jdbc/stptdemo"/>   </bean>  -->  <!-- JNDI Configuration tomcat    <bean id="stptinc" class="org.springframework.jndi.JndiObjectFactoryBean">  <property name="jndiName" value="java:comp/env/jdbc/stptinc"/>  </bean>    <bean id="stptdemo" class="org.springframework.jndi.JndiObjectFactoryBean">  <property name="jndiName" value="java:comp/env/jdbc/stptdemo"/>  </bean>--> <!-- =================================================================== --> <!-- SessionFactory(For Hibernate)/ManagerFactory(For JPA) Define        --> <!--  ONLY ONE OF THEM SHOULD BE USED                                    --> <!-- =================================================================== --> <!--  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" spring 2.5之后继承的工厂类 -->  <bean id="sessionFactory"  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  <property name="dataSource" ref="stptdemo" />  <property name="configLocation"   value="classpath:hibernate.cfg.xml" />   <property name="packagesToScan"><!-- 自动扫描注解 -->      <list>          <value>com.wonders.*</value>      </list>   </property>  <property name="configurationClass"  value="org.hibernate.cfg.AnnotationConfiguration"></property>  <property name="lobHandler" ref="${jdbc.handler}" /> </bean>  <bean id="sessionFactory2"  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  <property name="dataSource" ref="stptinc" />  <property name="configLocation"   value="classpath:hibernate.cfg.xml" />   <property name="packagesToScan"><!-- 自动扫描注解 -->      <list>          <value>com.wonders.*</value>      </list>   </property>  <property name="configurationClass"  value="org.hibernate.cfg.AnnotationConfiguration"></property>  <property name="lobHandler" ref="${jdbc.handler}" /> </bean>  <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">  <property name="sessionFactory" ref="sessionFactory"></property> </bean>  <bean id="hibernateTemplate2" class="org.springframework.orm.hibernate3.HibernateTemplate">  <property name="sessionFactory" ref="sessionFactory2"></property> </bean>  <!--<bean id = "jdbcTemplate" class = "org.springframework.jdbc.core.JdbcTemplate">     <property name = "dataSource" ref="dataSource"/> </bean>  <bean id = "jdbcTemplate2" class = "org.springframework.jdbc.core.JdbcTemplate">     <property name = "dataSource" ref="dataSource2"/> </bean>      --> <bean id = "stfb_jdbcTemplate" class = "org.springframework.jdbc.core.JdbcTemplate">     <property name = "dataSource" ref="stfb"/> </bean>  <bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler">  <property name="nativeJdbcExtractor" ref="nativeJdbcExtractor" /> </bean> <bean id="defaultLobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"> </bean> <bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" lazy-init="true" />   <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">        <property name="sessionFactory" ref="sessionFactory"/> </bean>  <bean id="txManager2" class="org.springframework.orm.hibernate3.HibernateTransactionManager">        <property name="sessionFactory" ref="sessionFactory2"/> </bean>  <bean id="dsTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  <property name="dataSource" ref="stptdemo" />  <qualifier value="stptdemo"/>  <!-- “限定符” --> </bean>  <bean id="dsTransactionManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  <property name="dataSource" ref="stptinc" />  <qualifier value="stptinc"/>    </bean>  <bean id="stfb-txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">      <property name="dataSource" ref="stfb"/>  </bean>  <tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>  <tx:annotation-driven transaction-manager="txManager2" proxy-target-class="true"/>  <tx:annotation-driven transaction-manager="stfb-txManager" proxy-target-class="true"/>  <!--   <aop:aspectj-autoproxy />有一个proxy-target-class属性,默认为false,  表示使用JDK动态代理织入增强,当配置 为<aop:aspectj-autoproxy proxy-target-class="true" />时,  表示使用CGLib动态代理技术织入增强。不过即使proxy-target-class设置为false,  如果目标类没有声明接口,则 Spring将自动使用CGLib动态代理。  --> <!-- jdk 动态代理  必须有接口实现--> <aop:aspectj-autoproxy/> <!-- 强制使用cglib 代理  针对类--> <!-- <aop:aspectj-autoproxy proxy-target-class="true" />--></beans>


           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值