如何避免UPDATE与UPDATE之间的死锁

gaowd 2008-02-27 04:35:33
如题
...全文
347 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaowd 2008-02-28
  • 打赏
  • 举报
回复
回复6楼,这样其他事务读取该表时会造成脏读吧
zefuzhang2008 2008-02-27
  • 打赏
  • 举报
回复
update tb with(HOLDLOCK)
set ..
where
则,直到事务结束才释放该锁,期间其他事务可以读取该表的数据(行,页,表级别)
gaowd 2008-02-27
  • 打赏
  • 举报
回复
回复4楼,以单据记账为例TAB1,账本TAB2为一汇总数,不同用户在记明细单据TAB1时,不同单据TAB1信息可能是相同的,汇总到账本TAB2上就是一条记录,这样就会形成不同进程同时更新账本TAB2的一条记录


dawugui 2008-02-27
  • 打赏
  • 举报
回复
如果两个进程同时更新一条记录呢?

从大多数业务来说,你这个需求不太现实,也不允许这么做.
gaowd 2008-02-27
  • 打赏
  • 举报
回复
如果两个进程同时更新一条记录呢?
ldb5736030 2008-02-27
  • 打赏
  • 举报
回复
锁定要更新的纪录!
dawugui 2008-02-27
  • 打赏
  • 举报
回复
1 如何锁一个表的某一行
/*
测试环境:windows 2K server + Mssql 2000
所有功能都进行测试过,并有相应的结果集,如果有什么疑义在论坛跟帖
关于版权的说明:部分资料来自互联网,如有不当请联系版主,版主会在第一时间处理。
功能:sql遍历文件夹下的文本文件名,当然你修改部分代码后可以完成各种文件的列表。
*/


A 连接中执行

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

begin tran

select * from tablename with (rowlock) where id=3

waitfor delay '00:00:05'

commit tran

B连接中如果执行

update tablename set colname='10' where id=3 --则要等待5秒

update tablename set colname='10' where id<>3 --可立即执行

2 锁定数据库的一个表

SELECT * FROM table WITH (HOLDLOCK)


注意: 锁定数据库的一个表的区别

SELECT * FROM table WITH (HOLDLOCK)
其他事务可以读取表,但不能更新删除

SELECT * FROM table WITH (TABLOCKX)
其他事务不能读取表,更新和删除

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧