- 论坛徽章:
- 0
|
这一行说的没错,也就是说如果你使用
begin;
select * from table1 where id = 1 for update;
......
commit;
这样的写法,在这个事务当中这一行是被锁定的.直至事务结束.
但还有一段是告诉我,不能在一个plpgsql的funtion里面使用for update/share.这样的方法去锁一个行.我要的是在存储过程里面执行这样的锁行动作.前面的代码是可以执行的,但不能放在function ()里面.这样的限制好奇怪.我不放在存储过程里面我要锁单行的动作有什么意义.一般也没有谁写大段的sql代码而不用存储过程的吧.
倒是在网上找到一个解决方案,是使用 pg_advisory_lock来锁单行.但这个锁好奇怪,不是sql的标准锁.没有底的东西,不太敢用.....
再有就是直接在事务开始的时候更新行...这个方案还是我一个同事想出来的.想想也对,我直接update这一行,他存储过程总应该就锁住了吧.反正一个存储过程也不让我写commit或rollback savepoint 这样的东西..直接执行到最后,好在pgsql如果执行出错会回滚整个存储过程,不象sqlserver,在哪一行出错这一行不执行..前面的就不管了..... |
|