考试科目:PGCA-E-090
考试题量:40 道单项选择题、10 道多项选择题(每题 2 分)
通过分数:60%
考试时间:60min
本文为云贝教育刘峰(微信:yunbee_DBA)原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。
PostgresSQL是否能够自动检测到死锁,然后退出其中一个事务?
A.是
B.否
参考答案:A
解析:
模拟死琐
1)准备一张表,插入两条数据
testdb=> select * from s1.t2;id
-----111222
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
-------122222
(2 rows)
发现第一行数据修改被提交,第二行数据修改被回滚。