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を使用しています。
なぜJavaプログラムにブレークポイントを置くと、別のプログラムがクエリを実行できなくなるのでしょうか?表から読み取るトランザクションが1つしかないとIBMが他のすべてのトランザクションをブロックした場合、IBMは誰にでもDB2を販売できますか? –
データベースのレベルでペシミスティック・ロギングが行われました。サーバーでトランザクションが保留されているため、DB2は他のクライアントが同じ行を読み取ることを許可しないでください。 – RKodakandla
なぜですか?ロックを使用していないときに悲観的なロックが使用されると仮定しているのはなぜですか?なぜそれは、トランザクションが**別のトランザクション**が読んでいる**行を読んで**防止するでしょうか? –