如何在PostgreSQL中设置事务中的“SELECT FOR UPDATE”超时?

sigwle7e  于 2022-12-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(346)

我有一个包含idnamestockproduct表,如下所示。

product表格:

| 身份证|姓名|股票|
| - ------| - ------| - ------|
| 1个|苹果|十个|
| 第二章|橙色|二十个|
然后,在T1运行SELECT FOR UPDATE之后,T2需要等待T1提交很长时间才能运行SELECT FOR UPDATE,如下所示,因为SELECT FOR UPDATE在默认情况下没有超时:
| 流量|交易1(T1)|交易2(T2)|解释|
| - ------| - ------| - ------| - ------|
| 第一步|BEGIN;| |T1启动。|
| 第二步||BEGIN;|T2启动。|
| 第三步|x1米10英寸1x二十个||通过"选择更新",T1读取20。|
| 第四步||SELECT stock FROM product WHERE id = 2 FOR UPDATE;|T2需要等待T1提交以使用"SELECT FOR UPDATE"读取stock。|
| 第五步||等待...|...|
| 第六步||等待...|...|
| 一步...||等待...|...|
| 一步...||等待...|...|
| 一步...||等待...|...|
| 第九十八步|COMMIT;|等待...| T1提交。|
| 第九十九步||SELECT stock FROM product WHERE id = 2 FOR UPDATE;二十个|现在使用"选择更新",T2读取20|
| 第一百步||COMMIT;|T2提交。|
现在,我希望T2在等待T1 3秒后回滚,如下所示:
| 流量|交易1(T1)|交易2(T2)|解释|
| - ------| - ------| - ------| - ------|
| 第一步|BEGIN;| |T1启动。|
| 第二步||BEGIN;|T2启动。|
| 第三步|x1米20英寸1x二十个||通过"选择更新",T1读取20。|
| 第四步||SELECT stock FROM product WHERE id = 2 FOR UPDATE;|T2需要等待T1提交以使用"SELECT FOR UPDATE"读取stock。|
| 第五步||等待...|...|
| 第六步||等待...|...|
| 第七步||回滚;|T2在等待T1 3秒后回滚。|
| 一步...||||
| 一步...||||
| 第九十八步||||
| 第九十九步||||
| 第一百步|COMMIT;| |T1提交。|
那么,如何在PostgreSQL中为SELECT FOR UPDATE设置3秒的事务超时呢?

2izufjch

2izufjch1#

看看这个答案:https://stackoverflow.com/a/20963803/8963723

BEGIN;
SET LOCAL lock_timeout = '3s';
SELECT ....;
COMMIT;

相关问题