假设:
我有以下问题:
INSERT 操作有可能导致死锁吗?如果可能,请提供一个详细的场景说明死锁是如何发生的(例如线程1执行死锁,线程2执行死锁)。UPDATE:3.关于超级奖励点:在下面的场景中我如何避免死锁?
给出的表格:
[id BIGINT PRIMARY KEY][id BIGINT PRIMARY KEY, name VARCHAR(30), permission_id BIGINT NOT NULL, FOREIGN KEY (permission_id) REFERENCES permissions(id))我创建一个新的公司如下:
我删除一家公司如下:
在上面的示例中,插入锁定顺序是权限,而删除锁定顺序是公司权限。是否有方法修复此示例以用于REPEATABLE_READ或SERIALIZABLE隔离?
发布于 2013-05-14 03:49:55
通常,所有的修改都会导致死锁,而selects不会(稍后再进行)。所以
你甚至不需要多张桌子。
创建死锁的最佳方法是以不同的顺序执行相同的操作。
Server示例:
create table A
(
PK int primary key
)第1场会议:
begin transaction
insert into A values(1)第2场会议:
begin transaction
insert into A values(7)第1场会议:
delete from A where PK=7第2场会议:
delete from A where PK=1你会陷入僵局。因此,这证明了插入和删除可以死锁。
更新类似:
第1场会议:
begin transaction
insert into A values(1)
insert into A values(2)
commit
begin transaction
update A set PK=7 where PK=1第2场会议:
begin transaction
update A set pk=9 where pk=2
update A set pk=8 where pk=1第1场会议:
update A set pk=9 where pk=2死锁!
SELECT永远不应该死锁,但是在某些数据库上,它会这样做,因为它使用的锁会干扰一致的读取。不过,这只是糟糕的数据库引擎设计。
如果使用快照隔离,Server将不会锁定选择。Oracle &我认为Postgres永远不会锁定SELECT (除非您有UPDATE,这显然是在为更新保留)。
所以基本上我认为你有一些错误的假设。我想我已经证明:
您只需在SELECT上接受我的话;)但是它将取决于您的DB和设置。
发布于 2016-04-28 08:28:13
除了LoztInSpace的答案之外,inserts甚至在没有deletes或updates的情况下也可能导致死锁。您所需要的只是一个唯一的索引和一个反转的操作顺序。
Oracle中的示例:
create table t1 (id number);
create unique index t1_pk on t1 (id);
--thread 1 :
insert into t1 values(1);
--thread 2
insert into t1 values(2);
--thread 1 :
insert into t1 values(2);
--thread 2
insert into t1 values(1); -- deadlock !发布于 2013-05-14 02:58:01
让我们假设您有两个关系A和B以及两个用户X和Y。表A被用户X锁定,表B被Y锁定。如果用户X和Y同时使用,下面的查询将给您一个死锁。
Select * from A,B因此,显然,如果涉及多个表的联接操作是Select操作的一部分,则会导致死锁。通常,插入和删除操作涉及单个关系。所以他们可能不会造成僵局。
https://stackoverflow.com/questions/16534277
复制相似问题