2017-09-05 21 views
0

DB2データベーステーブルから最初に有効になっているアカウントを読み取り、そのカラムをすぐに更新して無効にする必要があります。サーバー1が列を読み込んで更新している間は、一度に1つのサーバーだけで1つのアカウントを使用する必要があるため、他のサーバーは同じ行を読み取ることができません。これは私がこれまで持っているものであるスプリングデータJPA - 更新行の選択

..

Account.java

Account{ 
     private Long id; 
     private Character enabled; 
     ............. 
    } 

AccountRepository.java

public interface AccountRepository extends JpaRepository<Account, Long>{ 
     Account findFirstByEnabled(new Character('Y'));  
    } 

AccountServiceImpl.java

@Service 
public class AccountServiceImpl { 

     @Autowrired 
     private AccountRepository accntRepository; 

     @Transactional 
     public Account findFirstAvaialbleAccount(){ 

      Account account = accntRepository.findFirstByEnabled(new Character('Y')); 

      if(account != null) 
      { 
      account.setEnabled(new Character('N')); //put debug point here 
      account.save(proxyAccount); 
      } 

     return account; 
    } 
} 

しかし、このISN働いているng .. findFirstAvaialbleAccount()メソッドにデバッグポインタを置いています。私が期待していたのは、デバッグポインタがその行に達し、実行を再開するのを待っている場合、データベースでselectクエリを直接実行すると、SQLは実行されません。トランザクションが完了するように、サーバー上で実行を再開した後にのみ実行する必要があります。しかし、データベース上で直接selectクエリを実行すると、すぐに完全な結果セットが得られました。私はここで何が欠けていますか?私はDB2を使用しています。

+0

なぜJavaプログラムにブレークポイントを置くと、別のプログラムがクエリを実行できなくなるのでしょうか?表から読み取るトランザクションが1つしかないとIBMが他のすべてのトランザクションをブロックした場合、IBMは誰にでもDB2を販売できますか? –

+0

データベースのレベルでペシミスティック・ロギングが行われました。サーバーでトランザクションが保留されているため、DB2は他のクライアントが同じ行を読み取ることを許可しないでください。 – RKodakandla

+0

なぜですか?ロックを使用していないときに悲観的なロックが使用されると仮定しているのはなぜですか?なぜそれは、トランザクションが**別のトランザクション**が読んでいる**行を読んで**防止するでしょうか? –

答えて

0

私自身の質問に答える...私は間違っていました。データベースに対して実行中のSQLを選択してください。 select.sqlを "select .. for update"で実行すると、サーバー上でresumeを押してトランザクションが完了するまで実行が待機します。

SQL 1 - これは、サーバーからのトランザクションが完了していなくてもすぐに実行されます。

select * from MYTABLEここでENABLED = 'Y';サーバーからのトランザクションが完了するまで、これは待機

SQL 2-(私は十分に迅速に再開ヒットしない場合、それはおそらく、タイムアウトになります)

は= ENABLED「Y」 最初の1行をフェッチMYTABLEから選択* rsを使用してのみ、更新ロックを保持します。

関連する問題