我正在尝试用Java实现数据库的两阶段锁定。它不是一个真正的数据库,只是为此问题实现的简单SQL数据库。
我需要获取数据库以执行如下查询:
SELECT * FROM account WHERE aid=%0 OR aid=%1 FOR UPDATE;
该问题表明我们必须获取表级和行级锁才能执行此查询。这是我目前所在的位置:
这有效,但是并发性很小,所以我试图用ReentrantReadWriteLocks替换我的ReentrantLocks。
将table.lock.lock()
更改为table.rlock.readLock().lock()
后,我得到
IllegalMonitorStateException: attempt to unlock read lock, not locked by current thread
基本上,我不知道如何解决此问题。我认为readLock会起作用,因为SQL语句不会修改表。
我也尝试在表上使用writeLock,我的想法是ReentrantLock和WriteLock都是互斥的,但是我又得到了IlegalMonitorStateException
。
当尝试将行锁从ReentrantLocks更改为ReadLocks时,我也得到IllegalMonitorStateException
。
有人知道我在做什么错吗?
谢谢!