我正在尝试在H2数据库中使用行级锁定。有没有办法在单个连接中获取和释放记录级锁?
SELECT *
FROM "locks"
WHERE key = 'lock1'
FOR UPDATE;
SELECT *
FROM "locks"
WHERE key = 'lock2'
FOR UPDATE;
现在我想重新启动 lock1 ,但继续按 lock2 。 我试图插入“BEGIN TRANSACTION”;在lock2之前,但COMMIT释放两个锁。
增加: 我将使用H2作为服务器数据库的本地缓存。 目标是实现跨程序同步(java)。 数据不会以1:1同步,程序将控制存储的内容。 FileChannels在Linux中不起作用,套接字工作正常,但我发现它们很丑陋。 任务:
此时我看到两种方式
答案 0 :(得分:0)
我自己从未尝试过,理论上你应该能够插入一条记录,选择它进行更新,通过删除来释放锁记录。 H2可能不会在 MVCC -Mode中使用,否则新记录将不会被另一个连接看到。
我不确定,你想要实现什么,这可能不是可行的方法,但锁应该被释放而另一个持续存在。
答案 1 :(得分:0)
理论上你应该能够像这样使用SAVEPOINT:
SELECT * FROM "locks" WHERE key = 'lock1' FOR UPDATE;
SAVEPOINT beforeLock2;
SELECT * FROM "locks" WHERE key = 'lock2' FOR UPDATE;
ROLLBACK TO SAVEPOINT beforeLock2;
在实践中,它不起作用且lock2
行仍然处于锁定状态,可能是一个错误,所以我发布它希望托马斯会看到它。
根据您的描述,我没有看到您为何能够使用lock1
的2个连接和lock2
的另一个连接的原因。您可以使用连接池,然后创建连接所需的时间不会成为问题。