假设:
- 我正在使用 REPEATABLE_READ 或 SERIALIZABLE 事务隔离(每次访问一行时都会保留锁)
- 我们正在谈论同时访问多个表的多个线程。
我有以下问题:
- 操作是否可能
INSERT
导致死锁?如果是这样,请提供一个详细的场景来说明死锁是如何发生的(例如,线程 1 执行此操作,线程 2 执行此操作,...,死锁)。 - 对于加分:对所有其他操作(例如 SELECT、UPDATE、DELETE)回答相同的问题。
更新: 3. 对于超级奖励积分:在以下情况下如何避免死锁?
给定表格:
- 权限
[id BIGINT PRIMARY KEY]
- 公司
[id BIGINT PRIMARY KEY, name VARCHAR(30), permission_id BIGINT NOT NULL, FOREIGN KEY (permission_id) REFERENCES permissions(id))
我创建一个新公司如下:
- 插入权限;-- 插入 permissions.id = 100
- 插入公司(名称,permission_id)值('Nintendo',100);-- 插入 company.id = 200
我删除公司如下:
- SELECT permission_id FROM Companies WHERE id = 200; -- 返回permission_id = 100
- 从 id = 200 的公司中删除;
- DELETE FROM 权限 WHERE id = 100;
在上面的示例中,INSERT 锁定顺序是 [permissions, Companies],而 DELETE 锁定顺序是 [companies, permissions]。有没有办法解决这个例子REPEATABLE_READ
或SERIALIZABLE
隔离?