这两天为了验证JTA,做了一个小工程,主要意图是为了测试在Spring的JtaTransactionManager事务管理器下,管理多个数据库连接下的JDBC操作,实现异常后回滚,正常情况下提交,容器使用的是Jboss7.1.1
问题:前段Action调用Service时,总是无法回滚
先贴Spring配置(applicationContext-jta.xml)
<!-- Activates scanning of @Autowired -->
<context:annotation-config />
<!-- Activates scanning of @Repository and @Service -->
<context:component-scan base-package="com.jta" />
<!-- 从Jboss获取的数据源 -->
<jee:jndi-lookup id="oracleDataSourceProxy" jndi-name="java:jboss/datasources/OracleXA" />
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
<!-- 事务注解扫描 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
Service接口
@Transactional(propagation=Propagation.REQUIRED)
@Service("jtaService")
public interface JtaService {
void saveFiles();
}
Service实现类
@Service("jtaService")
@Transactional(propagation = Propagation.REQUIRED)
public class JtaServiceImpl implements JtaService {
@Autowired
private JtaDao jtaDao;
@Transactional(propagation = Propagation.REQUIRED)
public void saveFiles() {
Random r = new Random();
int i = r.nextInt(10000);
File file = new File();
file.setId(i);
file.setName("name_10000");
file.setContent("content_10000");
File file2 = new File();
file2.setId(10000);
file2.setName("name_10000");
file2.setContent("content_10000");
try {
jtaDao.insertToOracle(file);
//这里会出现主键冲突
jtaDao.insertToOracle(file2);
} catch (SQLException e) {
throw new RuntimeException("主键冲突错误!");
}
}
public JtaDao getJtaDao() {
return jtaDao;
}
public void setJtaDao(JtaDao jtaDao) {
this.jtaDao = jtaDao;
}
}
DAO类
@Component
public class JtaDao {
@Autowired
private DataSource oracleDataSourceProxy;
public int insertToOracle(File file) throws SQLException {
String sql = "insert into t_file values(?, ?, ?, sysdate)";
return insert(oracleDataSourceProxy, file, sql);
}
private int insert(DataSource ds, File file, String sql)
throws SQLException {
Connection conn = DataSourceUtils.getConnection(ds);
PreparedStatement ps = conn.prepareCall(sql);
ps.setInt(1, file.getId());
ps.setString(2, file.getName());
ps.setString(3, file.getContent());
int i = ps.executeUpdate();
DataSourceUtils.releaseConnection(conn, ds);
return i;
}
public DataSource getOracleDataSourceProxy() {
return oracleDataSourceProxy;
}
public void setOracleDataSourceProxy(DataSource oracleDataSourceProxy) {
this.oracleDataSourceProxy = oracleDataSourceProxy;
}
}
问题补充:使用JTA编程时方式测试可回滚和提交,证明Jboss和数据源及驱动都支持JTA
public void test() throws NamingException, SQLException, IllegalStateException, SecurityException, SystemException {
UserTransaction ut = null;
InitialContext ic = new InitialContext();
ut = (UserTransaction) ic.lookup("java:comp/UserTransaction");
System.out.println("ut=" + ut);
DataSource ds1 = (DataSource) ic.lookup("java:jboss/datasources/MySQLXA");
DataSource ds2 = (DataSource) ic.lookup("java:jboss/datasources/OracleXA");
Connection conn1 = null;
Connection conn2 = null;
try {
conn1 = ds1.getConnection();
conn2 = ds2.getConnection();
ut.begin();
insert(conn1, 1, "name1");
int i = 1 / 0;//抛出异常
insert(conn2, 2, "name2");
ut.commit();
} catch (NotSupportedException e) {
ut.rollback();
System.out.println(e.getMessage());
} catch (SystemException e) {
ut.rollback();
System.out.println(e.getMessage());
} catch (SecurityException e) {
ut.rollback();
System.out.println(e.getMessage());
} catch (IllegalStateException e) {
ut.rollback();
System.out.println(e.getMessage());
} catch (RollbackException e) {
ut.rollback();
System.out.println(e.getMessage());
} catch (HeuristicMixedException e) {
ut.rollback();
System.out.println(e.getMessage());
} catch (HeuristicRollbackException e) {
ut.rollback();
System.out.println(e.getMessage());
} catch(Exception e) {
ut.rollback();
System.out.println(e.getMessage());
}
}
问题补充:
问题自己已经解决:
主要是将注解方式换成了XML配置,问题出在事务注解扫描未生效,换了方式之后成功,贴下成功后的配置:
<jee:jndi-lookup id="oracleDataSourceProxy" jndi-name="java:jboss/datasources/OracleXA" />
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="*" read-only="false"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="txPointCut"
expression="execution(* com.jta.service.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut" />
</aop:config>
<bean id="jtaDao" class="com.jta.dao.JtaDao">
<property name="oracleDataSourceProxy" ref="oracleDataSourceProxy"></property>
</bean>
<bean id="jtaService" class="com.jta.service.JtaServiceImpl">
<property name="jtaDao" ref="jtaDao"></property>
</bean>
相关推荐
在本教程中,我们将深入探讨如何在Spring MVC 3中结合MyBatis并利用JTA(Java Transaction API)以及JBoss 7.1应用程序服务器来配置多数据源环境。这个配置对于那些需要处理多个数据库或者分布式事务的项目来说至关...
配置JTA,你需要设置事务管理器,例如JBoss的Atomikos或WebLogic的WebLogicTransactionManager。 **XAPool** 是一个基于X/Open XA的JDBC连接池,提供高性能和高可用性的事务处理。在配置中,你需要定义连接池大小、...
SSJ压缩包应该包含了所有必需的库文件,如Struts1.x、Spring框架、JTA实现(如JBOSS Transactions)、MySQL JDBC驱动等。这些jar包应被添加到项目的类路径中,以便正确运行和编译程序。 总结来说,这个集成例子展示...
另外的问题就是spring和hibernate整合的问题了,当时也是一股脑的将hibernate和spring的包全导入进来,然后发布,启动tomcat,查看报错的问题,这个方面到没有出现版本差异的问题,典型的就是缺包,然后报找不到类,...
### 基于注解的Spring MVC+Hibernate简单入门 #### 概述 本文主要介绍如何使用基于注解的方式构建Spring MVC与Hibernate相结合的应用程序。这种方式不仅简化了配置过程,而且提高了开发效率。我们将通过一个具体的...
- `jta-1.1.jar`: 事务管理支持。 - `slf4j-api-1.5.8.jar`: 日志门面。 - `log4j.jar`: 具体的日志实现。 - `slf4j-log4j12-1.5.8.jar`: SLF4J到Log4J的桥接。 - `slf4j-simple-1.5.8.jar`: 简单的日志实现。 - `...
- jta或jboss-transaction-api:JTA(Java Transaction API)实现,用于分布式事务处理。 - slf4j-api和相应的实现:日志记录框架,如logback、log4j等。 - javax.servlet-api和javax.servlet.jsp-api:Servlet和...
然而,JTA的XA事务通常在J2EE环境下工作,需要容器支持,比如JBoss、WebLogic等。在J2SE环境中,Spring可以通过像JOTM这样的开源事务管理器来模拟JTA功能。 在Spring中配置多个数据源并进行事务管理,可以参考以下...
对于全局事务(JTA),Spring 可以配合 JTA 供应商如 JBoss、WebLogic 等进行分布式事务处理,而对于局部事务,Spring 则可以直接管理单一数据库的事务。 在性能方面,声明式事务处理通常比编程式事务更高效,因为...
3. jta和jboss-transaction-api:提供事务处理的支持。 4. 数据库驱动:例如mysql-connector-java或ojdbc14,取决于所使用的数据库。 "common"标签可能指的是包含一些通用库的压缩包,比如: 1. log4j:日志记录...
1.1-beta-7.jar jdbc2_0-stdext.jar jta.jar log4j-1.2.11.jar xerces-2.6.2.jar xml-apis.jar c3p0-0.9.0.jar concurrent-1.3.2.jar connector.jar jboss-cache.jar jboss...
- jta.jar(或相关的JTA实现如jboss-transaction-api_1.2_spec.jar):用于事务管理。 3. Spring - spring-aop.jar:Spring的面向切面编程模块,支持AOP代理和通知。 - spring-tx.jar:提供了声明式和编程式事务...
- JTA(Java Transaction API):适用于EJB环境或应用服务器,如WebLogic、JBOSS等。 - JDBC事务:适用于非容器管理的环境,直接通过Connection对象来控制事务。 二、Hibernate事务配置 在Hibernate配置文件...
因此,这个压缩包可能包含了一些与JBoss相关的库,如JNDI(Java Naming and Directory Interface)库,用于服务发现和命名,或者JTA(Java Transaction API)库,用于处理分布式事务。 接下来是MySQL,这是一个广泛...
spring-dao.jar spring-hibernate3.jar spring-ibatis.jar spring-jdbc.jar spring-jdo.jar spring-jpa.jar spring-portlet.jar spring-struts.jar spring-tomcat-weaver.jar spring-toplink.jar spring-web.jar ...
6. **jta.jar** 或 **jboss-transaction-api_1.1_spec.jar**:Java Transaction API,用于分布式事务管理。 7. **数据库驱动jar**:根据你的项目中使用的具体数据库(如mysql-connector.jar for MySQL,ojdbc.jar ...
1. **JDBC事务管理**:使用Java Database Connectivity (JDBC) API时,可以通过Connection对象的commit()和rollback()方法手动开启和结束事务。然而,这种方式需要开发者自己处理事务的边界,可能导致代码复杂且难以...
10. **jta.jar**或**jboss-transaction-api_1.1_spec.jar**:用于分布式事务处理,依赖于具体的JTA实现。 11. **mysql-connector-java.jar**或其他数据库驱动:连接到特定数据库所需的JDBC驱动。 在实际项目中,还...
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" /> ``` 或Java配置: ```java @Bean public PlatformTransactionManager transactionManager() { ...