我需要从DB2数据库表中读取第一个启用的帐户,并立即更新列以禁用它。当服务器1正在读取和更新列时,没有其他服务器应该能够读取同一行,因为我希望一次只有一个服务器使用一个帐户。
这是我到目前为止所拥有的......
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;
}
}
但这不起作用..我在findFirstAvaialbleAccount()方法中放了一个调试指针。我期待的是,如果调试指针到达该行并等待我继续执行,如果我直接在数据库上运行select查询,则不应该执行sql。它应该只在我在服务器上恢复执行后才执行,以便完成事务。但是,直接在数据库上运行select查询会立即给出完整的结果集。我在这里错过了什么?如果重要的话,我正在使用DB2。
答案 0 :(得分:0)
回答我自己的问题......我对数据库运行的Select SQL不正确。如果我使用“select ... for update”运行select sql,那么执行将一直等到我在服务器上点击resume并且事务完成。
SQL 1 - 即使来自服务器的事务未完成,也会立即执行。
从MYTABLE中选择*,其中ENABLED ='Y';
SQL 2-这等待直到服务器的事务完成(如果我没有足够快地命中恢复,它可能会超时)
从MYTABLE中选择*,其中ENABLED ='Y' 仅使用rs获取前1行并保留更新锁;