- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想更好地理解 postgres 中的锁定机制。
假设树可以有苹果(通过苹果表上的外键)。似乎在选择一棵树进行更新时,锁定是在苹果上获得的。但是,即使其他人已经持有此苹果的锁,该操作也不会被阻止。
为什么会这样?
附注请不要建议删除“select for update”。
Transaction 1 Transaction 2
BEGIN .
update apple; .
. BEGIN
. select tree for update;
. update apple;
. --halts because of the other transaction locking an apple
update apple; .
-- deadlock .
COMMIT
--transaction succeeds
如果你想在你的 postgres 中尝试它 - 这是你可以复制/粘贴的代码。
我有以下数据库模式
CREATE TABLE trees (
id integer primary key
);
create table apples (
id integer primary key,
tree_id integer references trees(id)
);
和非常简单的数据
insert into trees values(1);
insert into apples values(1,1);
有两个简单的事务。一个是更新苹果,第二个是锁定一棵树并更新一个苹果。
BEGIN;
UPDATE apples SET id = id WHERE id = 1;
-- run second transaction in paralell
UPDATE apples SET id = id WHERE id = 1;
COMMIT;
BEGIN;
SELECT id FROM trees WHERE id = 1 FOR UPDATE;
UPDATE apples SET id = id WHERE id = 1;
COMMIT;
当我运行它们时 - 第一个事务的第二次更新发生死锁。
ERROR: deadlock detected
DETAIL: Process 81122 waits for ShareLock on transaction 227154; blocked by process 81100.
Process 81100 waits for ShareLock on transaction 227153; blocked by process 81122.
CONTEXT: SQL statement "SELECT 1 FROM ONLY "public"."trees" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x"
最佳答案
只是一个疯狂的猜测:你遇到了一个与实现细节相关的问题......
具体来说,您的select tree for update
语句获取对树的独占锁。并且 update apples
语句获得相关苹果的独占锁。
当您在苹果上运行更新时,Postgres 的每行外键相关触发器会触发,以确保 tree_id
存在。我不记得它们的确切名称,但它们在目录中,文档中有一些点点滴滴明确或隐含地引用它们,例如:
create constraint trigger ... on ... from ...
http://www.postgresql.org/docs/current/static/sql-createtrigger.html
无论如何,这些触发器将运行以下内容:
select exists (select 1 from trees where id = 1);
这就是您的问题所在:由于 select for update
导致的独占访问使其等待事务 2 释放对树的锁定以完成其对苹果的更新语句,但是事务 2正在等待事务 1 完成以获得对苹果的锁定,从而开始对苹果的更新语句。
结果,Postgres 陷入僵局。
关于postgresql - 涉及外键约束的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18536147/
我有类似下面的代码: ... id: myComponent signal updateState() property variant modelList: [] Repeater { mo
我正在处理一些我无法展示的私有(private)代码,但我已经制作了一些示例代码来描述我的问题: 主.c: #include #include #include #include typede
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: what are the differences in die() and exit() in PHP? 我想
在编写 Perl 模块时,在模块内部使用 croak/die 是一个好习惯吗? 毕竟,如果调用者不使用 eval block ,模块可能会使调用它的程序崩溃。 在这些情况下,最佳做法是什么? 最佳答案
我有一些搜索线程正在存储结果。我知道当线程启动时,JVM native 代码会代理在操作系统上创建新 native 线程的请求。这需要 JVM 之外的一些内存。当线程终止并且我保留对它的引用并将其用作
我刚刚花了很多时间调试一个我追溯到 wantarray() 的问题。 .我已将其提炼为这个测试用例。 (忽略 $! 在这种情况下不会有任何有用信息的事实)。我想知道为什么wantarray在第二个示例
我看到一些代码是这样做的: if(something){ echo 'exit from program'; die; } ...more code 和其他只使用 die 的人: if
我正在尝试将此表格用于: 如果任何 $_POST 变量等于任何其他 $_POST 变量抛出错误。 如果只有几个,那不是问题,但我有大约 20 个左右所以如果我想这样做,我将不得不像这样 但这
每次我运行: hadoop dfsadmin -report 我得到以下输出: Configured Capacity: 0 (0 KB) Present Capacity: 0 (0 KB) DFS
我是一名优秀的程序员,十分优秀!