求救! SQLSERVER死锁,崩溃了. 在线等!

luozhangwen 2012-10-15 04:41:56
并发操作, 并发量大概在5个左右, 每个并发量的数据量在5000左右, 500一次存储

同个事务操作是先删除, 后插入, 不知道为什么会死锁, 把并发给弄成串行就不死锁了, 但是串行太慢了~

各位大大帮帮忙啊, 非常感谢!
...全文
305 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangdong441325 2012-10-18
  • 打赏
  • 举报
回复
我也想用数据库锁
ycwhhr 2012-10-16
  • 打赏
  • 举报
回复
表相互间的关系,逆向处理时子先主后,正常存储时主先子后。
以学习为目的 2012-10-16
  • 打赏
  • 举报
回复
楼上几位讲的你综合排查下你的故障,看看能不能解决你的问题
gogodiy 2012-10-16
  • 打赏
  • 举报
回复
使用SQL Server Profiler工具,选择Locks事件类的Lock:Deadlock(死锁)和Lock:Deadlock Chain(死锁链),然后跟踪看下你这5个并发,看看锁对应的SPID以及相关的先后顺序、发生时间等等,再进行判断。
对于代码,你可以将先删除,后插入放在一个事务中,然后写入存储过程。并发用户只调用这个存储过程,让MSSQL自己去根据数据库设置的事务等级自己去处理。
最后你要确实到底是死锁了,还是阻塞,还是正常的锁等待,这是完全不同的3个概念。
qurihong 2012-10-16
  • 打赏
  • 举报
回复
“先删除, 后插入”,删除时需要先scan找到这笔资料,问题就出在这里,“交叉的检索和插入”导致死锁,最简单的办法就是修改sql server的默认隔离级别read committed为read uncommitted
如果觉得不放心,可以考虑使用SNAPSHOT_ISOLATION
sqlfun 2012-10-15
  • 打赏
  • 举报
回复
1、机器未崩溃之前,人不能先崩溃

2、死锁其实没那么复杂,无非是A请求B时,需要顺序使用锁1和锁2;B请求A时,需要顺序使用锁2和锁1,谁也不让谁,结果就死锁了。

3、找死锁的方法建议使用profiler,找到根源就更容易解决问题了。
http://www.simple-talk.com/sql/learn-sql-server/how-to-track-down-deadlocks-using-sql-server-2005-profiler/

4、good luck
汤姆克鲁斯 2012-10-15
  • 打赏
  • 举报
回复
频率有多高啊?
是死锁还是阻塞?
大力水手 2012-10-15
  • 打赏
  • 举报
回复
我感觉你还是把语句贴出来,你的5个的意识也不太清楚什么意识..5个事务吗! 正常的锁等待不叫死锁.
發糞塗牆 2012-10-15
  • 打赏
  • 举报
回复
發糞塗牆 2012-10-15
  • 打赏
  • 举报
回复
死锁这个范畴很大,你需要先找出哪个语句导致的。其实根源还是太慢了,并且占用资源太多,使得其他事务要等待,给你几个改进建议:
1、如果表很大,使用2005以后的分区表,这样扫描的范围小很多。
2、改进索引,往往索引不好,会导致i/O很大、速度慢。好的索引可以把一个大查询秒杀,这样就算占用稍微大一点的资源很快释放了。其他事务也不用等待太久。
3、由于你一个事务中用到了另外一个真在等待的事务,所以导致了死锁,这点尽量能分开操作就分开操作。把速度提高的时候,可以使用with nolock来减少锁的占用。

22,300

社区成员

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

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