我在我的项目中使用pg,pg-native,我使用类似下面代码的事务,我不熟悉数据库,
https://github.com/brianc/node-postgres/wiki/Transactions
1.这个锁定表还是只锁定行?
2.锁定意味着Create
中的Update
,Delete
,CRUD
。但仍然可以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));
...
答案 0 :(得分:5)
阅读the documentation了解完整情况。值得努力。
PostgreSQL具有不同级别的锁定:表锁和行锁(我不会进入咨询过程)。
可以使用LOCK
命令明确地使用表锁,但这是您不能正常执行的操作。正常情况是访问表时采用的隐式表锁 - 例如,当您在表中读取或写入数据时,将采取阻止来自ALTER
或DROP
的并发用户的锁定在桌子上。
行锁由DML语句(INSERT
,UPDATE
和DELETE
)以及SELECT ... FOR SHARE/UPDATE
采用。它们阻止了对锁定行的并发修改。
所有锁都在事务结束时释放。如果您没有显式启动事务,则每个语句都在其自己的事务中运行,并且锁定不会超过单个语句的持续时间。如果您使用BEGIN
或START TRANSACTION
明确启动交易,则会一直持续到COMMIT
或ROLLBACK
。
PostgreSQL(以及使用 multiversion并发控制的任何其他数据库)的一个重要设计概念是读者永远不会阻止编写者,反之亦然。这可以通过保留旧版本的数据来实现,并且读者可以使用在快照上有效的数据(粗略地说,数据库的一致视图在语句或事务开始时有效)。 这些旧行最终会被 autovacuum 后台进程清理。