如何通过JDBC锁定PostgreSQL数据库?

时间:2012-09-06 13:07:46

标签: java postgresql jdbc locking postgresql-8.4

在我的Java webapp中,如果数据库通过JDBC连接是最新的,则每个实例都会检查启动。如果数据库不是最新的,它将通过执行SQL脚本执行更新例程。

我无法控制实例何时获得startet。因此,我需要确保只有一个实例同时执行数据库更新。理想情况下,我需要锁定整个数据库,但根据

http://www.postgresql.org/docs/8.4/static/explicit-locking.html

http://wiki.postgresql.org/wiki/Lock_database

PostgreSQL不支持它(我仍在使用版本8.4)。

我还有其他选择吗?

2 个答案:

答案 0 :(得分:3)

如果您控制所有实例的代码,那么您可以在数据库中创建一个表,其中每个启动的实例在此表中查找带有时间戳的记录。让我们称之为“锁定”记录。

如果进程发现锁记录不存在,则会插入记录并处理您需要的数据。

如果进程发现锁记录确实存在,那么您可以假设另一个进程已创建它并且什么都不做,忙等待或者什么都没有。

使用此设计,您可以有效地在数据库中创建“锁定”以使您的进程与您同步。你编写它,所以所有进程都知道它们必须遵守锁记录的逻辑。

具有锁定的第一个进程已完成处理后,应清除锁定记录,以便下次重新启动行为正常。您还需要考虑由于服务器错误或执行错误而未清除锁定的情况。通常情况下,如果锁定时间早于n分钟,您可以将其视为“陈旧”,因此请将其删除,然后重新创建(或只更新它)。

处理“锁定”记录时,请确保在数据库连接上使用Serializable隔离级别,以保证原子性。

在调用数据访问层之前,Java代码的 Service 层可以使用锁定策略强制执行。无论你是否使用Hibernate都没关系,因为它只是应用程序逻辑。

答案 1 :(得分:0)

  

理想情况下,我需要锁定整个数据库。

只要您有效地序列化访问权限,您的锁适用于什么真的很重要?只需获得任何表格或行的独占锁定。