如何获取 table 上的锁而不让其他事务获得读取权限?
How to acquire lock on a table and not let other transaction get read access?
我有一个 nodejs 程序,它使用 sequelize 创建 tables 并基于它插入数据。
现在,将来我们将有多个程序实例,因此我们不希望多个实例在程序启动期间从 table 中读取,以便只有一个实例可以执行设置操作如果需要,其他实例不应该 'any access' 到 table,直到第一个实例完成它的工作。
我检查了 'transaction locking' - shared 和 exclusive 但它们似乎都提供了对 table我不想要的。
我的要求是具体来说,一旦一个事务获取 table 上的锁,其他事务就不能从那个 table 读取,除非第一个已经完成了它的工作。我该怎么做?
在MySQL中使用LOCK TABLES锁定整个table。
在 postgresql 中 LOCK TABLE whatever IN EXCLUSIVE MODE;
就可以了。
为了获得最佳效果,请在启动应用程序时寻找特定的 table。做一些简单而快速的事情,比如 SELECT id FROM whatever LIMIT 1;
来探测 table 是否存在。如果您的应用因为 table 不存在而出现异常,则执行
CREATE TABLE whatever ....;
LOCK TABLES whatever WRITE;
来自创建 table 的应用。它会阻止从您的应用程序的所有实例访问 table,但获得 LOCK 的实例除外。
一旦您的 table 被锁定,我建议的初始 SELECT
将阻止其他客户端。如果两个客户端尝试或多或少地同时创建 table,则可能存在竞争条件。但是额外的 CREATE TABLE 会抛出异常。
注意:如果您锁定多个 table,并且可能 运行 来自多个应用程序实例的代码,请始终锁定 table相同的顺序,否则你有可能出现死锁。
如文档所述in the manual 锁定 table 的语句是 LOCK TABLE ...
如果您以独占模式锁定 table,则不允许其他访问 - 甚至 SELECT 也不行。独占模式是默认的:
If no lock mode is specified, then ACCESS EXCLUSIVE, the most restrictive mode, is used.
手册explains不同的锁定模式:
ACCESS EXCLUSIVE
This mode guarantees that the holder is the only transaction accessing the table in any way.
我有一个 nodejs 程序,它使用 sequelize 创建 tables 并基于它插入数据。
现在,将来我们将有多个程序实例,因此我们不希望多个实例在程序启动期间从 table 中读取,以便只有一个实例可以执行设置操作如果需要,其他实例不应该 'any access' 到 table,直到第一个实例完成它的工作。
我检查了 'transaction locking' - shared 和 exclusive 但它们似乎都提供了对 table我不想要的。
我的要求是具体来说,一旦一个事务获取 table 上的锁,其他事务就不能从那个 table 读取,除非第一个已经完成了它的工作。我该怎么做?
在MySQL中使用LOCK TABLES锁定整个table。
在 postgresql 中 LOCK TABLE whatever IN EXCLUSIVE MODE;
就可以了。
为了获得最佳效果,请在启动应用程序时寻找特定的 table。做一些简单而快速的事情,比如 SELECT id FROM whatever LIMIT 1;
来探测 table 是否存在。如果您的应用因为 table 不存在而出现异常,则执行
CREATE TABLE whatever ....;
LOCK TABLES whatever WRITE;
来自创建 table 的应用。它会阻止从您的应用程序的所有实例访问 table,但获得 LOCK 的实例除外。
一旦您的 table 被锁定,我建议的初始 SELECT
将阻止其他客户端。如果两个客户端尝试或多或少地同时创建 table,则可能存在竞争条件。但是额外的 CREATE TABLE 会抛出异常。
注意:如果您锁定多个 table,并且可能 运行 来自多个应用程序实例的代码,请始终锁定 table相同的顺序,否则你有可能出现死锁。
如文档所述in the manual 锁定 table 的语句是 LOCK TABLE ...
如果您以独占模式锁定 table,则不允许其他访问 - 甚至 SELECT 也不行。独占模式是默认的:
If no lock mode is specified, then ACCESS EXCLUSIVE, the most restrictive mode, is used.
手册explains不同的锁定模式:
ACCESS EXCLUSIVE
This mode guarantees that the holder is the only transaction accessing the table in any way.