【发布时间】:2017-08-27 16:04:50
【问题描述】:
我正在尝试在 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 中不工作,套接字工作正常,但我发现它们是丑陋的解决方案。 任务:
- 数据库与服务器同步;只有一个程序应该执行同步。
- 日志写入;程序使用 2 个日志文件并从一个切换到另一个。为防止冲突,我们应该锁定文件的写入时间。
- 可能是别的东西。
此时我看到了两种方式
- 每次创建新连接并在任务执行后释放。建立连接需要近 600 毫秒。
- 使用临时表:CREATE AND DROP TEMPORARY TABLE tmp_lock1()。耗时 2ms。问题:如果有 2 个连接和第一个创建临时表并突然完成工作(例如一些错误),表将仍然存在,直到第二个程序工作。
【问题讨论】: