释放H2数据库的锁定

时间:2017-08-27 16:04:50

标签: locking h2

我正在尝试在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中不起作用,套接字工作正常,但我发现它们很丑陋。 任务:

  1. 与服务器的数据库同步;只有一个程序应该执行同步。
  2. 日志写作;程序使用2个日志文件并从一个切换到另一个。为了防止冲突,我们应该锁定文件写入时间。
  3. 可能是其他的东西。
  4. 此时我看到两种方式

    1. 每次创建新连接并在任务执行后释放。连接建立需要近600毫秒。
    2. 使用临时表:CREATE AND DROP TEMPORARY TABLE tmp_lock1()。需要2ms。问题:如果有2个连接,第1个创建临时表并突然完成工作(例如某个bug),表格仍然存在,直到第2个程序正常工作。

2 个答案:

答案 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的另一个连接的原因。您可以使用连接池,然后创建连接所需的时间不会成为问题。