我正在使用Spring-Data-Cassandra通过单个节点(本地主机)来操纵Cassandra中的数据。但是我遇到的问题是Spring-Date-Cassandra会删除我的更新语句或无提示更新失败。我使用的驱动程序是Apache Cassandra的DataStax Java驱动程序3.6.0。 下面是我创建表的语句
"CREATE TABLE IF NOT EXISTS " + keyspace
+ ".insurance_lock(lockId int, lockStatus int, PRIMARY KEY (lockId))"
这是我要使用的存储库
public interface LockRepository extends CrudRepository<LockEntity, Integer> {
@Query("update insurance.insurance_lock set lockstatus = 1 where lockid = 1 if lockstatus = 0")
public boolean lock();
@Query("update insurance.insurance_lock set lockstatus = 0 where lockid = 1")
public void unlock();
}
下面是要运行的测试代码。 dbController内部将调用lockRepository方法来更改锁定状态。
@Test
public void updateLockStatusTest(){
for (int i = 0; i < 100; ++i) {
lockRepository.deleteAll();
LockEntity lockEntity = new LockEntity(1, 0);
lockRepository.save(lockEntity);
boolean updated = dbController.lock();
lockEntity = lockRepository.findById(1).orElse(null);
Assert.assertTrue(1 == lockEntity.getLockStatus());
Assert.assertEquals(true, updated);
updated = dbController.lock();
Assert.assertEquals(false, updated);
Assert.assertTrue(1 == lockRepository.findById(1).orElse(null).getLockStatus());
dbController.unlock();
Integer status = lockRepository.findById(1).orElse(null).getLockStatus();
Assert.assertTrue(0 == status);
updated = dbController.lock();
Assert.assertEquals(true, updated);
Assert.assertTrue(1 == lockRepository.findById(1).orElse(null).getLockStatus());
dbController.unlock();
status = lockRepository.findById(1).get().getLockStatus();
Assert.assertTrue(0 == status);
}
}
但是,代码始终在代码的最后一行(状态== 1)中失败,在恢复锁定状态(应该为0)之后。我还检查了Cassandra控制台,发现锁定状态仍然是调用reset方法后为1。因此,我假设这是引起Cassandra放弃update命令的问题,因此更新无提示地失败。但我不明白为什么会发生此问题。