当前位置: 首页 > 知识库问答 >
问题:

交易退出前的Spring提交

颛孙建业
2023-03-14

我们正在尝试从Spring 2.5.2升级到4.0.5. RELEASE,但发现Spring的事务管理不再起作用。

在我们的生产应用程序中,所有数据库操作都通过一个标有@Transactional注释的Spring bean(使用默认设置)。几年来,这一直按预期工作,如果在事务边界内抛出RuntimeException,就会发生回滚。然而,当我们升级到Spring 4.0.5时。释放时,它的作用相当于自动提交设置为true。

我们通过查看堆栈跟踪验证了问题代码仍然在事务代理中运行。但是当我们在进入事务后对表执行简单的一行更新时,更新就提交了。这很令人费解,因为我们所做的只是更改Spring版本。

在以后的Spring版本中自动提交行为是否发生了变化?在4.05下是否需要进行一些额外的配置?

下面是我们的事务管理器的配置(在2.52中相同

<tx:annotation-driven transaction-manager="transactionManager" />
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="efmsDataSource" />
</bean>

<bean id="efmsDataSource" class="com.uprr.eni.commons.dao.OracleDataSource">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@${db_instance}.oracle.uprr.com:1521:${db_instance}" />
    <property name="username" value="${db_user}" />
    <property name="password" value="${db_password}" />
    <property name="maxActive" value="8" />
</bean>

这是在我们的代码中具有@Transactional方法的bean:

<bean id="efmsExecutor" class="com.uprr.eni.commons.dao.exec.DataSourceExecutorBean">
    <property name="dataSource" ref="efmsDataSource" />
</bean>

下面是我们如何创建应用程序上下文

context = new ClassPathXmlApplicationContext(CONFIG_FILES);
efmsExecutorBean = (DataSourceExecutorBean)context.getBean(EFMS_EXECUTOR_BEAN);

我们将该bean保存在静态变量

当我们想要启动交易时,我们调用:

efmsExecutorBean.executeTransaction(executor);

这是我们在DataSourceExecutorBean中调用的启动事务的方法。它基本上只是将其内部数据源传递给执行器(实际执行数据库工作的代码)。

@Transactional public void executeTransaction(final DataSourceExecutor executor) {

    executor.execute(source);                                   // Perform the unit of work
    final StringList errors = executor.getResult().getErrors(); // Did any errors occur?
    if (!errors.isEmpty()) {                                    // If so
        for (final String error : errors) {
            ApiLog.error(error);                                // Record them
        }
        throw new ExecutorError(ERROR, executor.getName());     // Abort
    }
}

当我重新检查这两个版本的日志时,我注意到4.0.5(坏)版本有一些2.5.2版本没有的条目。这些条目在事务开始时显示:

2014-07-31 09:34:43576[btpool0-0]调试-创建单例bean“efmsDataSource”的共享实例2014-07-31 09:34:43576[btpool0-0]调试-创建bean“efmsDataSource”的实例2014-07-31 09:34:43576[btpool0-0]调试-急切地缓存bean“efmsDataSource”,以允许解析潜在的循环引用

也许这可以解释发生了什么(但不是为什么)。看起来单例数据源bean并不是真正的单例。谷歌向一些人展示了类似的问题,但没有说明如何解决。这对任何人都有影响吗?

共有1个答案

居星阑
2023-03-14

您的代码是否直接使用Oracle数据源(而不是通过JdbcTemplate?)如果是这样,您需要将其包装在TransactionWaredataSourceProxy中,并将其注入到数据访问bean中。

 类似资料:
  • 说明 统一收单交易退款接口SDK。 官方文档:https://docs.open.alipay.com/api_1/alipay.trade.refund/ 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayApp\Params\Refund\Request 属性 名称 类型 说明 $method string 接口名称 $app_auth_token string 详见:h

  • 说明 支付宝境外到店支付-交易退款 官方文档:https://global.alipay.com/service/external_QR_Code/22 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayCrossBorder\InStore\Refund\Request 属性 名称 类型 说明 $service string 接口名称 $notify_url string

  • composer transaction submit命令将交易提交给业务网络。 句法 composer transaction submit composer transaction submit [options] Options: --help Show help [boolean] -v, --version

  • 说明 统一收单交易退款查询接口SDK。 官方文档:https://docs.open.alipay.com/api_1/alipay.trade.fastpay.refund.query/ 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayApp\Params\RefundQuery\Request 属性 名称 类型 说明 $method string 接口名称 $app_a

  • 问题内容: 我有一个功能: JavaScript中有类似的东西吗? 问题答案: 您可以使用。 这将发送返回值到所谓的函数。 当然,您可以指定其他返回值。返回的任何值都将使用上面的示例记录到控制台。

  • 检出之前的提交 git checkout git checkout 这个命令有三个不同的作用:检出文件、检出提交和检出分支。在这一章中,我们只关心前两种用法。 检出提交会使工作目录和这个提交完全匹配。你可以用它来查看项目之前的状态,而不改变当前的状态。检出文件使你能够查看某个特定文件的旧版本,而工作目录中剩下的文件不变。 用法 git checkout master 回到 master 分支。分支