0

以下にコードを貼り付けました。私たちのアプリケーションでは、彼らはスレッドローカルでトランザクションを設定しました。
実際、私の疑問は、なぜこれが必要なのかということです。
トランザクションをスレッドローカルに設定しなかった場合はどうなるでしょうか?

public void beginTransaction() {

    final String METHOD_NAME = "beginTransaction";
    log.entering(CLASS_NAME, METHOD_NAME);

    PcUtilLogging.logTransactionLifecycle("Begin Transaction",
            this.persistenceConfigurationKey);

    // Initialize.
    final PcRequestContext context = PcRequestContext.getInstance();
    final PersistenceManager pm =
            context.getPersistenceManager(this.persistenceConfigurationKey);

    try {
        // Begin a new transaction.
        final Transaction transaction = pm.newTransaction();

        // Set the Transaction in ThreadLocal.
        context.setTransaction(this.persistenceConfigurationKey,
                transaction);

    } catch (final Exception e) {

        // Throw.
        throw new PcTransactionException(
                new ApplicationExceptionAttributes.Builder(CLASS_NAME, METHOD_NAME).build(),
                "Error encountered while attempting to begin a ["
                        + this.getPersistenceConfigurationKey()
                        + "] transaction.", e);
    }

    log.exiting(CLASS_NAME, METHOD_NAME);
    return;
}
4

1 に答える 1

2

問題は、アプリケーションのさまざまな部分(たとえば、さまざまなDAO)からトランザクションにアクセスしたいということです。そのため、通常はこの方法で行われるため、トランザクションオブジェクトをアプリケーションの周囲に渡す必要がなくなります(永続化ロジックがアプリにリークすることもありません)。 。

また、トランザクションは通常、リクエスト(またはjmsメッセージ)を受け取るスレッドに関連しているため、ThreadLocalはそれを配置するのに便利な場所です。ほとんどのフレームワークはこれを行います(例としてSpring)。

スレッドローカルにトランザクションを設定しないと、2つのことが起こる可能性があります

  • 各DBアクセスは、異なるトランザクションを使用する必要があります。
  • 1つのリクエストに対するコミットが別のスレッドの変更に影響を与えるため、すべてのトランザクションが混同されます。

このアダラを行うためのより良い方法はありますか?

于 2013-02-06T13:04:34.110 に答える