暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

云贝教育 |【PostgreSQL PGCA题目解析5】PostgresSQL是否能够自动检测到死锁,然后退出其中一个事务?

原创 云贝教育 2023-11-23
283

考试科目:PGCA-E-090

考试题量:40 道单项选择题、10 道多项选择题(每题 2 分)

通过分数:60%

考试时间:60min

本文为云贝教育刘峰(微信:yunbee_DBA)原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。


PostgresSQL是否能够自动检测到死锁,然后退出其中一个事务?

A.是

B.否

参考答案:A


解析:

模拟死锁

1)准备一张表,插入两条数据

testdb=> select * from s1.t2;
 id
-----
 111
 222


2)窗口1开启事务1

testdb=> begin;
BEGIN
testdb=*> update s1.t2 set id=1 where id=111;


3)窗口2开启事务2

testdb=> begin;
BEGIN
testdb=*> update s1.t2 set id=2 where id=222;
UPDATE 1


4)回到窗口1,修改事务2的数据

testdb=*> update s1.t2 set id=22222 where id=222;
。。。。等待中


5)回到窗口2,修改事务1的数据

testdb=*> update s1.t2 set id=1111 where id=111;


6)此时窗口的事务2监控到死琐

ERROR: deadlock detected
DETAIL: Process 113991 waits for ShareLock on transaction 779; blocked by process 119247.
Process 119247 waits for ShareLock on transaction 780; blocked by process 113991.
HINT: See server log for query details.
CONTEXT: while updating tuple (0,3) in relation "t2"


7)查看最终数据

testdb=> select * from s1.t2;
  id
-------
     1
 22222
(2 rows)


发现第一行数据修改被提交,第二行数据修改被回滚。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论