PostgreSQL事务锁

时间:2016-11-08 21:46:40

标签: node.js database postgresql

我在我的项目中使用pg,pg-native,我使用类似下面代码的事务,我不熟悉数据库,
https://github.com/brianc/node-postgres/wiki/Transactions
1.这个锁定表还是只锁定行?
2.锁定意味着Create中的UpdateDeleteCRUD。但仍然可以Read?如果是,则选择数据,是否是此更改之前的数据(在BEGIN之前)?

" pg":" ^ 4.5.1", " pg-native":" ^ 1.10.0",

var pg = require('pg').native;
...

var rollback = function(dbClient, response) {
  dbClient.query('ROLLBACK', function() {
    dbClient.end();
    // reject(response);
  });
};

dbClient.query('BEGIN', function(error, result) {
  ...

dbClient.query('COMMIT', dbClient.end.bind(dbClient));
  ...

1 个答案:

答案 0 :(得分:5)

阅读the documentation了解完整情况。值得努力。

PostgreSQL具有不同级别的锁定:表锁和行锁(我不会进入咨询过程)。

可以使用LOCK命令明确地使用表锁,但这是您不能正常执行的操作。正常情况是访问表时采用的隐式表锁 - 例如,当您在表中读取或写入数据时,将采取阻止来自ALTERDROP的并发用户的锁定在桌子上。

行锁由DML语句(INSERTUPDATEDELETE)以及SELECT ... FOR SHARE/UPDATE采用。它们阻止了对锁定行的并发修改。

所有锁都在事务结束时释放。如果您没有显式启动事务,则每个语句都在其自己的事务中运行,并且锁定不会超过单个语句的持续时间。如果您使用BEGINSTART TRANSACTION明确启动交易,则会一直持续到COMMITROLLBACK

PostgreSQL(以及使用 multiversion并发控制的任何其他数据库)的一个重要设计概念是读者永远不会阻止编写者,反之亦然。这可以通过保留旧版本的数据来实现,并且读者可以使用在快照上有效的数据(粗略地说,数据库的一致视图在语句或事务开始时有效)。 这些旧行最终会被 autovacuum 后台进程清理。