首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用PosgreSQL测试pgAdmin死锁

如何用PosgreSQL测试pgAdmin死锁
EN

Stack Overflow用户
提问于 2022-05-22 10:56:21
回答 1查看 55关注 0票数 0

我想用不同的锁类型和隔离级别在PostgreSQL 13上使用pgAdmin 4测试死锁。

到目前为止,我已经尝试打开两个pgAdmin选项卡并运行不同的事务块,如下所示:

代码语言:javascript
复制
--LOCK stats IN SHARE ROW EXCLUSIVE MODE;
--LOCK stats IN ROW SHARE MODE;
--LOCK stats IN ROW EXCLUSIVE MODE;
--SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
UPDATE stats SET clicks = 10 WHERE id = 59;
UPDATE stats SET leads = 10 WHERE id = 60;
UPDATE stats SET calls = 10 WHERE id = 59;
UPDATE stats SET reviews = 10 WHERE id = 60;
UPDATE stats SET saves = 10 WHERE id = 59;
UPDATE stats SET bookings = 10 WHERE id = 60;
COMMIT;
代码语言:javascript
复制
--SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
UPDATE stats SET clicks = 10 WHERE vendor_id = 60;
UPDATE stats SET leads = 10 WHERE vendor_id = 59;
UPDATE stats SET calls = 10 WHERE vendor_id = 60;
UPDATE stats SET reviews = 10 WHERE vendor_id = 59;
UPDATE stats SET saves = 10 WHERE vendor_id = 60;
UPDATE stats SET bookings = 10 WHERE vendor_id = 59;
COMMIT;

但令我惊讶的是,无论锁类型和隔离级别如何,行都会被很好地更新。阅读文档时,我假设默认的表锁是ROW EXCLUSIVE,默认的事务隔离级别是READ COMMITTED

我想,在不同的pgAdmin选项卡上运行时,两个事务块都不会同时执行。这是预期的行为还是我做错了什么?如何在不同的线程中运行两个事务块?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-23 10:09:55

无论如何,为了避免死锁,我在过程中实现了不同的事务(插入、更新),并在每个事务之后使用COMMIT释放锁。

为了测试它,我已经用docker-compose部署了不同的服务来调用这个过程。此过程更新相同的表行,并重复调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72336928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档