弹簧数据JPA - 选择更新行
问题描述:
我有一个要求,从DB2数据库表中读取第一个启用的帐户,并立即更新列以禁用它。当服务器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。
答
回答我自己的问题......我有不正确的选择对数据库运行的SQL。如果我使用“select .. for update”运行select sql,那么执行等待,直到我在服务器上启动恢复并且事务完成。
SQL 1 - 即使来自服务器的事务未完成,也会立即执行。
select * from MYTABLE where ENABLED ='Y';
SQL 2 - 此等待,直到从服务器交易完成时(可能会超时,如果我不打恢复速度不够快)
SELECT * FROM MYTABLE启用该功能=“Y” 取第一行1只有rs使用并保持更新锁;
为什么你认为在Java程序中放置一个断点应该可以防止另一个程序执行查询?如果只有一个从表中读取的交易阻止了所有其他交易,那么IBM是否能够将DB2出售给任何人? –
悲观日志记录是在数据库级完成的。在服务器中挂起的事务中,DB2不应允许任何其他客户端读取同一行 – RKodakandla
为什么?为什么你假设在没有使用任何锁的情况下使用悲观锁定?为什么它会阻止一个事务**读**一行另一个事务**读取**。 –