【问题标题】:Spring PROPAGATION_REQUIRES_NEW, how does it suspend? How many transactions are in progress/suspended under the same thread?Spring PROPAGATION_REQUIRES_NEW,它是如何挂起的?在同一个线程下有多少事务正在进行/暂停?
【发布时间】:2015-02-13 17:01:03
【问题描述】:

我在交易方面遇到了一些问题。我没有使用 JTA。

有可能我已经在一个事务中开始一个新事务,最终导致这个异常:

java.lang.Thread.run(Thread.java:745)
    org.postgresql.util.PSQLException: The connection attempt failed.
    org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:233)
    org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:64)
    org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:144)
    org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:29)
    org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:21)
    org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:31)

java.lang.Thread.run(Thread.java:745)
    java.net.NoRouteToHostException: Cannot assign requested address
    java.net.PlainSocketImpl.socketConnect(Native Method)
    java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
    java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    java.net.Socket.connect(Socket.java:589)
    org.postgresql.core.PGStream.<init>(PGStream.java:61)
    org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:109)
    org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:64)
    org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:144)
    org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:29)
    org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:21)
    org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:31)
    org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
    org.postgresql.Driver.makeConnection(Driver.java:410)
    org.postgresql.Driver.connect(Driver.java:280)
    java.sql.DriverManager.getConnection(DriverManager.java:664)
    java.sql.DriverManager.getConnection(DriverManager.java:208)

我在这里读到,当不使用 JTA 时,它挂起并创建新事务的方式是通过创建新连接,可能解释了上面的异常。

How does transaction suspension work in Spring?

我的代码应该在创建新事务之前创建并提交事务,但是 我不确定。

我有 8 个线程填充数据,循环中的每个线程创建一个新事务,一遍又一遍地工作、提交。

我如何才能确定我是否处于交易的“嵌套”模式?

TransactionSynchronizationManager 仅提供当前事务是否存在的信息,而不是在同一线程下挂起多少个事务来确定这里是否存在问题。

如果可能的话,我还想知道有多少当前事务在全球范围内进行,跨所有线程。

【问题讨论】:

    标签: java spring hibernate spring-mvc annotations


    【解决方案1】:

    当传播设置为PROPAGATION_REQUIRED 时,将为应用该设置的每个方法创建一个逻辑事务范围。每个这样的逻辑事务范围可以单独确定仅回滚状态,外部事务范围在逻辑上独立于内部事务范围。当然,在标准PROPAGATION_REQUIRED 行为的情况下,所有这些范围都将映射到同一个物理事务。

    更多详情refer this link

    【讨论】:

    • 我认为 PROPAGATION_REQUIRED 将加入现有事务,从而在后续 PROPAGATION_REQUIRED 方法出现错误的情况下导致所有事务回滚。我对这种说法感到有些惊讶。你有多确定? :)
    • 它加入事务,但根据每个方法的@Transactional(...) 设置单独应用超时、comminOn/rollbackOn。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多