当我编辑某行数据的时候
先执行 select 并锁定该行不能被查询 修改
更新完成 update 该行 解锁
怎么实现啊····
sql 加锁 解锁 事务
------解决方案--------------------
会话1:
begin tran
select * from tb with(xlock) where id = 1
update tb
set col = 1
where id = 1
commit tran
回话2:
select * from tb with(xlock) where id = 1
就会被锁住,查询不到东西
------解决方案--------------------
编辑和真正的“更新”不应该放在一起吧,如果在编辑时锁住,然后你跑去泡妞了,那整个系统都给你堵住了,根据国外大牛paul的某本书,一般应该在真正更新的时候检查数据是否满足更新条件,然后更新,这个过程中加锁,加锁的行为不要等待用户响应
------解决方案--------------------
提升事务隔离等级到serializable
set transaction isolation level serializable
------解决方案--------------------
这个级别高了一点,重复读的级别就可以满足了。
------解决方案--------------------
哦,那应该增加一个字段比如,status 为1表示在审批,而0表示解锁,在查询时:
select *
from tt
where status = 0
也就是只能查询解锁的
------解决方案--------------------
楼主题目真拗口啊。
你要加锁因为是在编辑某行数据的时候,在编辑的时候,数据库会自动对表格,或者行数据加锁的,你不用再使用select ... with(xlock)再来加锁,多此一举。
7楼是正确答案。