SOS 关于spring JTA事务回滚问题 不能回滚
spring.xml
<?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: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-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<!-- JTA Start -->
<!-- JOTM本地实例 -->
<bean id="jotm" class ="org.springframework.transaction.jta.JotmFactoryBean">
</bean>
<!-- jta事务管理 -->
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction" ref="jotm">
</property>
</bean>
<!--XAPool配置,内部包含了一XA数据源,sqlserver数据库
支持JTA事务的数据源,必须封装成XAPool-->
<bean id="sqlserver" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
<property name="dataSource">
<bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
<property name="transactionManager" ref="jotm"/>
<property name="driverName"
value="com.microsoft.jdbc.sqlserver.SQLServerDriver" />
<property name="url"
value="jdbc:microsoft:sqlserver://192.168.10.162:1433;DatabaseName=uf_sales" />
</bean>
</property>
<property name="user" value="sa" />
<property name="password" value="njgascw5" />
</bean>
<!--XAPool配置,内部包含了一XA数据源,oracle数据库
支持JTA事务的数据源,必须封装成XAPool-->
<bean id="oracle" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
<property name="dataSource">
<bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
<property name="transactionManager" ref="jotm"/>
<property name="driverName" value="oracle.jdbc.driver.OracleDriver">
</property>
<property name="url"
value="jdbc:oracle:thin:@192.168.10.22:1521:orcl1" />
</bean>
</property>
<property name="user" value="crm" />
<property name="password" value="crm_itd3102" />
</bean>
<!--分别配置访问sqlserver、oracle数据源的Spring JDBC模板-->
<bean id="jtaOracleTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="oracle"/>
</bean>
<bean id="jtaSqlserverTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="sqlserver"/>
</bean>
<!-- jdbctemplate配置 -->
<bean id ="jdbcTemplate"
class ="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
<!-- Datasource Setup UFDATA_111_2008-->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="com.microsoft.jdbc.sqlserver.SQLServerDriver" />
<property name="url"
value="jdbc:microsoft:sqlserver://192.168.10.162:1433;DatabaseName=UFDATA_111_2008" />
<property name="username" value="sa" />
<property name="password" value="njgascw5" />
</bean>
<bean id="utfService"
class="com.together.sys.service.UtfServiceImpl">
<property name="jdbcTemplate">
<ref bean="jtaSqlserverTemplate" />
</property>
</bean>
<!-- 维护管理 -->
<bean id="integarService"
class="com.together.sys.service.IntegartionServiceImpl">
<property name="jdbcTemplate">
<ref bean="jtaOracleTemplate" />
</property>
</bean>
<!--跨数据库的JTA事务的业务类-->
<bean id="myService" class="com.together.sys.service.MyServiceImpl">
<property name="integarService" ref="integarService"/>
<property name="utfService" ref="utfService"/>
</bean>
<!-- 销售单管理 -->
<bean name="/invcoManage"
class="com.together.sys.action.InvcoAction">
<constructor-arg index="0" ref="operService" />
<constructor-arg index="1" ref="integarService" />
<constructor-arg index="2" ref="logService" />
<constructor-arg index="3" ref="typeService" />
<constructor-arg index="4" ref="smspriceService" />
<constructor-arg index="5" ref="utfService" />
<constructor-arg index="6" ref="datummService" />
<constructor-arg index="7" ref="whnumService" />
<constructor-arg index="8" ref="callfunService" />
<constructor-arg index="9" ref="myService" />
</bean>
<!-- 注解事务驱动 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
myservice.java
import com.together.sys.vo.SMS_SALEBILLVOUCH;
import com.together.sys.vo.SMS_SALEBILLVOUCHS;
import com.together.sys.vo.SaleBillVouch;
import com.together.sys.vo.SaleBillVouchs;
import org.springframework.transaction.annotation.Transactional;
public class MyServiceImpl implements MyService{
IntegartionService integarService;
UtfService utfService;
public IntegartionService getIntegarService() {
return integarService;
}
public void setIntegarService(IntegartionService integarService) {
this.integarService = integarService;
}
public UtfService getUtfService() {
return utfService;
}
public void setUtfService(UtfService utfService) {
this.utfService = utfService;
}
//@Transactional(readOnly=false)
public void addAllSaleBillVouch(String sql,SMS_SALEBILLVOUCH sms_sale,String uftsql, SaleBillVouch sale) {
integarService.insertSMS_SALEBILLVOUCH(sql, sms_sale);
utfService.insertSaleBillVouch(uftsql, sale);
}
//@Transactional(readOnly=false)
public void addAllSaleBillVouchs(String sql,SMS_SALEBILLVOUCHS sms_sales, String uftsql,SaleBillVouchs sales) {
integarService.insert1SMS_SALEBILLVOUCHS(sql, sms_sales);
utfService.insertSaleBillVouchs(uftsql, sales);
}
}
action
SaleBillVouch sbv = new SaleBillVouch();
sbv.setSbvid(sbvid);
sbv.setCsbvcode(csbvcode);
sbv.setCstcode("01");
sbv.setCvouchtype("01");
sbv.setCrdcode("erererererererwere");//违反约束
sbv.setCdepcode(cdepcode);
sbv.setCpersoncode(cpersoncode);
sbv.setCcuscode("11111");
sbv.setIexchrate(1);
sbv.setItaxrate(17);
sbv.setBretumflag(0);
sbv.setCmaker(cmaker);
sbv.setCinvalider("");
sbv.setCverifier("");
sbv.setCcusname("客户");
sbv.setCbustype(cbustype);
sbv.setCdlcode(cdlcode);
sbv.setCacounnter("");
sbv.setCchecker("");
sbv.setDdate(_ddate);
String sqlsbv = "insert into SaleBillVouch(SBVID ,cSBVCode,cSTCode,cVouchType,dDate,cRdCode,cDepCode,cPersonCode,cCusCode,iExchRate,"
+ "iTaxRate,bReturnFlag,cMaker,cInvalider,cVerifier,cBusType,cCusName,cDLCode,cAccounter,cChecker)"
+ " values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
//uservice.insertSaleBillVouch(sqlsbv, sbv);
myService.addAllSaleBillVouch(sqlslv, slv, sqlsbv, sbv);