Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring事务不';我不能使用Oracle Express_Oracle_Spring_Bitronix - Fatal编程技术网

Spring事务不';我不能使用Oracle Express

Spring事务不';我不能使用Oracle Express,oracle,spring,bitronix,Oracle,Spring,Bitronix,我有一个简单的独立应用程序来测试Spring的事务管理。 有甲骨文速成版。 运行以下命令以启用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_t

我有一个简单的独立应用程序来测试Spring的事务管理。 有甲骨文速成版。 运行以下命令以启用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;
    <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>
我的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");
    }
}
    <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>
因此,所有的想法都太过复杂,无法看到事务回滚。 我运行了几个配置示例,记录一直都是提交的。 不执行回滚。没有错误,什么都没有,只是预期而已

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>
我的最后一个配置是:

    <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>

${jdbc.username}
${jdbc.password}
${jdbc.url}

通过提供的数据源实例化的JDBC模板似乎可以处理自己的事务[通过自动开始和提交事务]。异常是在单独的提交/回滚周期中运行的异常之后抛出的,因此您可以看到写操作是持久的。要验证它,您可以将代码移动到MasterDAO类中引发异常,并检查回滚。

尝试了此操作。无更改。
2013-04-16 09:32:27623[main]INFO Transaction.DbUpdater-使用ds1插入2013-04-16 09:32:27626[main]INFO Transaction.MasterDAO-事务活动:错误日志显示没有活动事务您实际上是对的。我将DbUpdater添加为Springbean,现在我在日志中看到了事务消息。然而,这一记录仍然存在,但我认为这已经是另一个问题了
    <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>