【问题标题】:jpa2.1 StoredProcedureQuery transaction planjpa2.1 StoredProcedureQuery事务计划
【发布时间】:2014-12-31 12:35:51
【问题描述】:

在 jpa 2.1 中,api StoredProcedureQuery 已被表示为调用 JDBC CallableStatement。 问题是当我在非事务性方法中调用执行一些插入操作的 oracle 过程时,我不希望更改提交,但看起来更改将提交时令人震惊。 它有什么问题?

【问题讨论】:

  • 如果您在事务之外调用查询,那么您希望 JPA 提供程序做什么?这不是通灵的。如果你想控制的话,把它放在一个 txn 中
  • 我希望它什么也不做。但我无法理解提交 tx 的内容。
  • 如果您在事务之外执行“它”,那么这就是“自动提交”(在这种情况下唯一有意义的事情)。我看不出这有多“令人震惊”。只需将事务放入并回滚
  • 不,它不是自动提交,因为我已将其设置为 false。这就是它令人震惊的原因。
  • 愿意解释一下您认为“我已将其设置为 false”的内容吗? JPA 没有这样的“AUTO COMMIT”概念。它唯一拥有的是一个 FlushModeType,它适用于你在交易中的时候。如果你想做“一些 INSERT 操作”并且不希望它提交,那么 ROLL IT BACK

标签: java hibernate jpa jpa-2.1


【解决方案1】:

JDBC 很简单;创建连接时默认启用自动提交,这将立即提交您执行的每条语句。您可以手动将其关闭,然后您可以选择提交事务或手动回滚。这扩展到 JPA(然后由 EntityManager 事务处理机制处理)并进一步扩展到应用程序容器。

如果您不希望提交更改,请不要提交事务。如果您正在使用一些事务处理中间件或 JPA,请确保它不会这样做。就这么简单。

您的非事务性方法导致 autoCommit 连接被初始化,或者它不是真正的非事务性方法,但这取决于您的中间件和 jpa 提供程序实现。

【讨论】:

  • 你是对的。它应该就这么简单。但正如我所说的问题是,我的方法不是事务性的,并且 jpa 的 autoCommit 属性设置为 false 并且它以任何方式提交事务。
  • 您使用的提供事务语义的中间件是什么?我会先在那里寻找问题。
【解决方案2】:

在处理旧版应用程序时,这张旧票帮助了我很多。 我的问题是每次调用 execute() 时似乎都会提交一个 StoredProcedureQuery,无论 TransactionAttribute 值如何,或者我使用 UserTransaction 时。

经过一番折腾,我找到了明显的原因:数据源本身禁用了 jta。几年前有人在定义中添加了 jta=false...

<datasource jta="false" jndi-name="java:jboss/dbName" pool-name="poolName" 
      enabled="true" use-java-context="true">

我认为这有点次优和误导,因为人们认为他可以依赖事务,毕竟 TransactionSynchronizsationRegistry 返回预期值(活动事务),但数据源没有发挥作用。

感谢您提出问题和上述解释。

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2019-05-02
    • 2021-02-04
    • 2011-05-22
    • 2011-01-22
    • 2019-06-06
    相关资源
    最近更新 更多