我有一个简单的独立应用程序,用于使用Spring测试事务管理。 拥有Oracle Express Edition。 运行以下命令以启用XA

grant select on sys.dba_pending_transactions to user_test;
grant select on sys.pending_trans$ to user_test;
grant select on sys.dba_2pc_pending to user_test;
grant execute on sys.dbms_system to user_test;

我的Java代码大致如下:

public class DbUpdater 
{
    private static final ApplicationContext context = 
       new ClassPathXmlApplicationContext(new String[] {"spring_transactions.xml"});
    private static Logger log = LoggerFactory.getLogger(DbUpdater.class);

    @Transactional(propagation=Propagation.REQUIRED, readOnly=false)
    public void updateData()  {
        IMasterDAO ds1 = context.getBean("masterDao", IMasterDAO.class);
        log.info("Insert using ds1");
        ds1.insert("insert into users values(?,?)", "user1", "John Hamilton");
        log.info("Insert using ds1 finished successfully");

        throw new RuntimeException("A runtime exception");
    }
}

因此,所有想法都是看到交易回滚。 我运行了几个配置示例,并始终记录提交。 不执行回滚。 没有错误,没有,只有预期

Exception in thread "main" java.lang.RuntimeException: A runtime exception
at com.test.spring.transation.DbUpdater.updateData(DbUpdater.java:22)

我的最后一个配置是这样的:

    <bean id="txManager"
        class="org.springframework.transaction.jta.JtaTransactionManager">
            <property name="transactionManager" ref="bitronixTransactionManager" />
            <property name="userTransaction" ref="bitronixTransactionManager" />
    </bean>

    <bean id="btmConfig" factory-method="getConfiguration"
         class="bitronix.tm.TransactionManagerServices">
         <property name="serverId" value="spring-btm" />
    </bean>

    <bean id="bitronixTransactionManager" factory-method="getTransactionManager"
        class="bitronix.tm.TransactionManagerServices" 
                depends-on="btmConfig,dataSource"
        destroy-method="shutdown" />

    <bean id="dataSource" class="bitronix.tm.resource.jdbc.PoolingDataSource" 
      init-method="init" destroy-method="close">
    <property name="className" value="oracle.jdbc.xa.client.OracleXADataSource"/>
    <property name="uniqueName" value="myOracleDataSource"/>
    <property name="minPoolSize" value="0"/>
    <property name="maxPoolSize" value="5"/>
    <property name="allowLocalTransactions" value="true"/>
    <property name="testQuery" value="select sysdate from dual"/>
    <property name="driverProperties">
        <props>
            <prop key="user">${jdbc.username}</prop>
            <prop key="password">${jdbc.password}</prop>
            <prop key="URL">${jdbc.url}</prop>
        </props>
    </property>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
</bean>

<bean id="masterDao" class="com.test.spring.transation.MasterDAO">
    <property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>

</beans>

===============>>#1 票数:1 已采纳

通过提供的数据源实例化的JDBC模板似乎可以与它自己的事务一起工作[通过自动开始和提交事务]。 在单独的提交/回滚周期中操作之后,将引发异常,因此您会看到写入持续存在。 为了验证它,您可以移动代码以在MasterDAO类中引发异常并检查回滚。

  ask by BigWonder translate from so

未解决问题?本站智能推荐:

2回复

春季整合+交易+ Bitronix

我有一个基于Java的Web应用程序。 我正在使用Spring Integration与数据库(Jpa出站适配器)和Tibco EMS(JMS出站适配器)集成。 但是,现在我需要在一些代码中放入相同的消息:1.将消息持久存储在数据库中,并通过JMS发送2。 问题是这些活动(1和2)需要
1回复

春季批处理-交易失败-我如何找出问题所在?

根据spring手册https://spring.io/blog/2011/08/15/configuring-spring-and-jta-without-full-java-ee/ 幸运的是,使用Spring可以很好地避免这种复杂性。 根据实际情况: 给定一个春季批处
1回复

jBPM 6.5 + Tomcat 8 + Bitronix事务+ Oracle 11G配置| 无法提交会话java.lang.NullPointerException

我已按照此链接https://apurvasingh67.wordpress.com/2014/03/03/how-to-install-jbpm6-on-中提供的步骤,在tomcat 8 + Bitronix事务管理器+ Oracle 11G上成功配置了jBPM 6.5。 tomcat7-X
1回复

SQL数据弹簧不适用于具有复杂oracle数据类型的Oracle SQL过程

在Oracle中我有类似的类型: 程序: 如何在java中调用此过程? 这是一种特殊情况,其中一个oracle类型表包含另一个oracle类型表。 我曾尝试过使用SQL数据实现。 它不起作用。 只有当oracle类型记录没有表类型作为其参数之一时,它才能通过java工作。
1回复

涉及春季和非春季的JTA交易

通过使用诸如atomikos或bitronix之类的外部jta管理器,是否可以合并春季交易和非春季交易? 如果可能,我是否仍需要将方法注释为事务性的-如果事务跨越方法或类,该怎么办?
1回复

Java Hibernate标记替换不适用于Oracle数据库中的大字段

在简单的选择SQL中,对于VARCHAR2(50)字段,标记替换可以正常工作: 但是,对于另一个定义为VARCHAR2(4000)字段,它似乎仅适用于第一个字符(如果是数字则为前两个字符): 例如:如果errorMsg = "my test string" ,则查询工作正常。
1回复

Jooq不适用于春季交易

我尝试通过Spring JDBC使用Jooq进行设置,除了事务之外,其他所有东西都正常工作。 这是我当前的设置: 我在插入新课程的方法上使用@Transactional(propagation = Propagation.MANDATORY)批注,但是却遇到以下异常org.spri
1回复

Bitronix交易似乎过早提交

我们有一个使用bitronix事务管理器的spring-batch流程。 在特定步骤的第一步中,我们看到了预期的提交行为-仅在达到事务边界时才将数据提交到目标数据库。 但是,在第二遍及后续遍中,一旦写入行,便会提交它们。 也就是说,他们不等待提交点。 我们已经确认,bitroni
2回复

适用于Oracle 11的JNDI在TC Server中不起作用

我尝试了几天,在TC Server中为Oracle 11配置了JNDI,但没有成功。 有趣的是,当我为Oracle 9做完全相同的事情时,它工作正常。 我的第一个虽然是oracle jar文件,但是我正在使用最新的文件。 所以这里是我的配置和错误。 如果有人可以给我提示,我将非常感激。
1回复

适用于hibernate-dialect org.hibernate.dialect.Oracle9Dialect的适当Oracle下载

我正在更改使用java spring实现的旧版软件。 现在的挑战是,我想确定在初始开发过程中使用的适当的数据库。 我在代码的某处看到了休眠方言是org.hibernate.dialect.Oracle9Dialect所以我想使用该信息确定要安装的oracle版本。 请问我是Oracle