0

私は新しいSpringユーザーです。スコープとトランザクションについて質問があります。

たとえば、次のようなサービスがあります。

<bean id="bankInDaoService" class="service.dao.impl.UserDaoServiceImpl">

2 人同時に入金したいとします。そして、バンクイン目的のメソッドである Hibernate トランザクションに対して、既に@Transactionalを上に置きました。

私の質問は次のとおりです。

  1. デフォルトの Spring スコープはシングルトンであるため。この2人は同じ価値観を共有していますか?(人1入庫500、人2入庫500)?
  2. @Transactional は有効ですか? つまり、最初の人がバンクインを完了し、次に人 2 になります。

あなたの助けに本当に感謝します。

4

2 に答える 2

2

@Transactional アノテーションの使用法を誤解しています。

@Transactional アノテーションは、すべてのトランザクションを成功させるか、まったくトランザクションを成功させない場合に使用されます。いずれかのトランザクションが失敗した場合、他の成功したトランザクションはロールバックされます。同期用ではありません。

10 個のフィールドの入力を取得する登録ページがあり、5 個がテーブル ユーザー用で、5 個がテーブル会社用であり、単一のサービス関数から両方のレコードを挿入している場合。その際、 @Transactional アノテーションを使用する必要があります。ユーザー テーブルで挿入が成功し、会社テーブルで失敗した場合、ユーザー テーブル レコードはロールバックされます。

これがお役に立てば幸いです。乾杯。

于 2012-09-19T06:00:25.750 に答える
1

デフォルトでSpring Beanがシングルトンであることは正しいです。しかし、実装が各呼び出しで内部状態を変更しない限り、これは問題になりません (これはかなり奇妙です。通常、サービス メソッドは、指定されたパラメーターで動作します)。

先ほど触れたように、各サービス メソッドの呼び出しには独自のパラメーターがあります。すなわち:

deposit(person1_ID, 500)

deposit(person2_ID, 750)

あなたが「同時に」と言ったように、スレッドごとに1人ずつ、これら両方の人々を同時に処理するマルチスレッドサーバーがあると安全に想定できます。メソッド パラメーターは、特定のスレッドのスタックに配置されます。そのため、サービスに関する限り、2 人の預金の間に接続や破損の可能性はまったくありません。

次に @Transactional アノテーションに目を向けます。Spring は「アスペクト」を使用してこの動作を実装します。これらは実行の各スレッドに個別に適用され、独立しています。

@Transactional で何らかの順序付けを強制する場合 (たとえば、 person2 にperson1 が預け入れた正確な金額を引き出してもらいたい場合)、1 つの @Transactional スコープ内で両方の操作を順番に実行する新しいメソッドを作成する必要があります。

于 2012-09-19T05:51:10.933 に答える