none
我这边遇到一个问题,请大家帮忙解决下 谢谢了 RRS feed

  • 问题



  • 这边有几个batch的sql,一次会跑很久,

    其中大部分都是insert得语句

    但是跑着跑着就会死锁。

    请问应该怎样解决呢?

    有什么比较好的解决办法吗?
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2009年10月20日 2:29

答案

  • 对于批量插入, 一般来说, 你可以考虑用导入的方式进行数据处理, 或者是每个插入, 先把数据插入到局部临时表, 然后一次性从临时表插入到正式, 以此来减少对正式表的操作频繁程度和粒度, 从而达到减少锁的目的
    2009年10月20日 4:18


  • 这边有几个batch的sql,一次会跑很久,

    其中大部分都是insert得语句

    但是跑着跑着就会死锁。

    请问应该怎样解决呢?

    有什么比较好的解决办法吗?
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.

    1、你确定是死锁? 还是长时间运行无响应
    2、编程控制第一提交的量
    3、sp_lock
    4、用一个中间表,不要建索引
    5、bcp ,bulk insert批量导入
    More: blog.csdn.net/happyflystone
    2009年10月21日 2:28

全部回复

  • 1. 查查看造成死锁的原因,是哪些应用造成的,分析他们的逻辑有没有不合理之处
    2. 尽量把这些应用放在不同的时间

    2009年10月20日 2:36
  • 1. 查查看造成死锁的原因,是哪些应用造成的,分析他们的逻辑有没有不合理之处
    2. 尽量把这些应用放在不同的时间



    查看了完全是insert的操作。

    因为是一次将几百笔单放到数据库中,所以是不能分开时间放的。
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2009年10月20日 2:42
  • 只打开一个查询分析器窗体执行sql,应该是自动逐条执行的哇,按道理不该会Lock呀...
    2009年10月20日 2:46
  • 用profiler监控下死锁。
    另外几百笔单放到数据库中,大概多少数据量?就是几百条吗?按理说不会很慢的,你检查下插入的表上有没有触发器之类的对象。
    2009年10月20日 2:50
    版主
  • 系统环境是否对insert 隐含commit ?   看看你的 insert 语句涉及的表,以及你的batch 语句的结构,是否会导致迟迟不提交或者性能低下而一直没有完成而相互锁定。

    简单的办法是显式的 commit 每个 insert
    2009年10月20日 3:59


  • 这边有几个batch的sql,一次会跑很久,

    其中大部分都是insert得语句

    但是跑着跑着就会死锁。

    请问应该怎样解决呢?

    有什么比较好的解决办法吗?
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.

    既然是有几个在同时跑, 那会产生锁是可能的
    这种情况, 一般是使用profile 或者查 sysprocess, 结合sp_lock去确定锁等待的资源, 从而分析锁的原因, 无法直接下判断的
    2009年10月20日 4:16
  • 对于批量插入, 一般来说, 你可以考虑用导入的方式进行数据处理, 或者是每个插入, 先把数据插入到局部临时表, 然后一次性从临时表插入到正式, 以此来减少对正式表的操作频繁程度和粒度, 从而达到减少锁的目的
    2009年10月20日 4:18



  • 用profiler监控下死锁。
    另外几百笔单放到数据库中,大概多少数据量?就是几百条吗?按理说不会很慢的,你检查下插入的表上有没有触发器之类的对象。


     被设计的表都不存在trigger的东西。

    另外所谓的几百张单是指对4个表进行insert和对一个表进行update。

    数据量预计下来才1K多笔


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2009年10月20日 15:56



  • 系统环境是否对insert 隐含commit ?   看看你的 insert 语句涉及的表,以及你的batch 语句的结构,是否会导致迟迟不提交或者性能低下而一直没有完成而相互锁定。

    简单的办法是显式的 commit 每个 insert



    系统环境是否对insert有隐含的commit,这个是怎么查看的?有问过负责人,他们说是插入一笔就commit一次。


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2009年10月20日 15:57



  • 对于批量插入, 一般来说, 你可以考虑用导入的方式进行数据处理, 或者是每个插入, 先把数据插入到局部临时表, 然后一次性从临时表插入到正式, 以此来减少对正式表的操作频繁程度和粒度, 从而达到减少锁的目的




    多谢邹大哥的建议,我们这边会测试下,谢谢。

    因为有4个insert,所以只需要建立4个临时表,然后往临时表里插入数据,最后统一向实体表中写入进去就好了吧。

    因为我看,一般插入一笔资料就commit,其中有一个表是插入不超过30笔记录就会commit。那么我到底应该是建立局部的临时表还是全局临时表呢?





    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2009年10月20日 16:03
  • 粒度要合理,否则会出现超时的情况。
    2009年10月21日 0:44



  • 粒度要合理,否则会出现超时的情况。

    瞭解 謝謝。  超時還好沒出現,只是出現了deadlock。so 鬱悶。


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2009年10月21日 1:12
  • 既然出现了deadlock,就应该有针对性地去分析解决死锁。
    可以用profiler中的lock事件类去监控,其中的死锁图对于分析死锁更是直观
    2009年10月21日 2:05
    版主


  • 这边有几个batch的sql,一次会跑很久,

    其中大部分都是insert得语句

    但是跑着跑着就会死锁。

    请问应该怎样解决呢?

    有什么比较好的解决办法吗?
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.

    1、你确定是死锁? 还是长时间运行无响应
    2、编程控制第一提交的量
    3、sp_lock
    4、用一个中间表,不要建索引
    5、bcp ,bulk insert批量导入
    More: blog.csdn.net/happyflystone
    2009年10月21日 2:28

  • 1、你确定是死锁? 还是长时间运行无响应
    2、编程控制第一提交的量
    3、sp_lock
    4、用一个中间表,不要建索引
    5、bcp ,bulk insert批量导入
    More: blog.csdn.net/happyflystone



    我有使用Profiler監控,裏面確實是deadlock。


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2009年10月21日 4:17