【问题标题】:Java Concurrent Update for multiple tables With Transaction support具有事务支持的多个表的 Java 并发更新
【发布时间】:2013-06-03 11:29:06
【问题描述】:

我正在寻找一个事务框架的开发,它需要同时更新数据库表。

简单来说,单个事务应该同时更新大约 8 个独立的表,如果任何更新抛出错误,整个事务应该失败。

有什么办法可以同时处理,

即,10 个线程更新 10 个表,如果任何更新失败,则所有更新都应回滚。

是否有任何框架可以让我处理这种情况。

如果你使用JTA或者Spring事务,它们会被同一个连接共享而破坏了并发更新的目的。

或者我可以使用基于自定义线程的解决方案编写的任何方式。

【问题讨论】:

标签: java multithreading concurrency transactions jta


【解决方案1】:

为什么使用 JTA 或 Spring Transaction 意味着您将使用相同的连接?如果您配置连接池并正确连接到它,您肯定会为您使用的每个线程获得不同的连接吗?

对我来说,这似乎是一个异常配置的分布式事务,我的第一次尝试是使用 Spring 和/或 Hibernate。我认为您只需确保将事务视为分布式事务。

【讨论】:

    【解决方案2】:

    您可以使用标准的 JDBC。 JDBC 允许您在多个线程之间共享单个连接。要使多个线程在一个事务中工作,您应该

    • 创建一个 java.sql.Connection / 或从池中获取它
    • 关闭自动提交
    • 使用相同的连接运行并发任务
    • 等待任务完成
    • 如果所有任务都成功完成则提交;否则回滚
    • 关闭连接

    如果使用 Spring 的 SingleConnectionDataSource 也可以使用 Spring JDBC

    【讨论】:

    • 感谢 Evgeniy Dorofeev。您的答案似乎是多表事务的正常解决方案,它没有解决并发部分。如果使用相同的连接,并发的全部目的就没有了。 JDBC 将序列化,它只会按顺序更新。
    • 如果你认为如果任务 2 stmt.executeUpdate 将被阻塞直到任务 1 stmt.executeUpdate 返回你就错了。测试一下。
    【解决方案3】:

    框架是JTA。

    这取决于您的数据库是否可以为所有线程使用 one 连接。详情请见here。所以在一般情况下,每个线程都需要一个连接。

    如果您使用 XA 数据源,您可以尝试在 JTA 事务的控制下运行并发线程。

    这很复杂,而且准备线程需要时间,所以它可能只有用,如果更新需要很长时间,受影响的表是独立的,并且您的数据库服务器中有足够的 CPU。

    更新

    关于事务传播,here你可以找到一些想法。

    【讨论】:

    • 多个线程可能同时与同一个全局事务关联。" - JTA 规范 v1.1,第 3.2 节,第 13 页。
    • 抱歉,我应该通过添加此引用来更新我的答案还是这是一个问题?
    • 好的,是的。该规范使用可能。这就是为什么我写你可以尝试 :-) 我已经为我的答案添加了更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2019-02-25
    • 2016-05-09
    • 1970-01-01
    相关资源
    最近更新 更多