大家好,小弟系统中有一张表tab,有多用户同时对该表进行增删改查。现在问题是update的时候经常出现死锁。
基本情况是这样的:
1、update:操作的是唯一记录,不可能同时有多人update一条记录,也不可能一人同时update多条记录;
2、delete:不可能多人同时delete一条记录,但一人同时可delete多条记录;
我已对update和delete的where后的条件字段加了索引。在update的时候,使用了WITH (ROWLOCK)。问:
1、出现死锁的原因是否是insert、delete时,整张表被锁了,因此update无法进行?
2、sqlserver的insert、delete、update默认是表锁还是行锁,如果我将delete也设为行锁,那么在一次delete多条记录的时候是不是会生成多个锁,导致性能下降?
谢谢,谢谢~~
------回答---------
------其他回答(5分)---------
SQL code
------其他回答(10分)---------
不要迷恋行锁,行锁只是传说
SQL的锁会自动升级。
应想法提高整体的性能,比如一般一次更新整批数据比一条一条更新效率高,更新何删除的条件一定要有好的索引
------其他回答(10分)---------
引用楼主 i_am_a_java_cainiao 的回复:
1、出现死锁的原因是否是insert、delete时,整张表被锁了,因此update无法进行?
2、sqlserver的insert、delete、update默认是表锁还是行锁,如果我将delete也设为行锁,那么在一次delete多条记录的时候是不是会生成多个锁,导致性能下降?
1,如果涉及数据量大的情况,会升级为表锁。
2,在有索引且涉及数据量不大的情况下是默认是行锁。
------其他回答(10分)---------
可禁用表升级,怎么禁用自己网上查下,
但禁用的话也有坏处,搞不好会系统崩溃的,
尽量不要使用‘禁用表升级’。
------其他回答(5分)---------
增加一个专门用于是否数据被锁的表,只要前台点UPDATE,就将个条数据放入到表中去,并且在前召程序中宣布该条数据被锁,禁止查看,OK?