我在程序的Application_BeginRequest 里面加入了一个用户在那个页面的记录直接update一个online表 当用户多的时候 可能因为并发的操作太多 就造成数据库的死锁 怎么来处理这个事情呢?我的sql语句很简单的 就只是一个update 而已 现在网站人一多就好卡

解决方案 »

  1.   

    加更新锁是什么意思 具体怎么做?还有我的sql语句就一个update 是不是也要加上 commit   or   rollback    这样才能防止死锁?
      

  2.   

    Application.Lock()
    代码
    Application.UnLock()
    检测在线或着用session事件来判断。虽然有差距。不过可以提高一点效率吧。
    或着把你的时间检测时间设长一点看先。
      

  3.   

    更新数据库的存储过程的一开始就开始事务begin tran 执行完成就提交commit tran
    这样能避免死锁
      

  4.   

    如果你使用SQL Server,那么即使你使用transaction,SQL Server也会自动在SQL命令中启动事物,所以再额外增加一个事务的做法没有意义。Application.Lock()则更是雪上加霜。你要测试你的事务是否在1、2秒钟内都能结束,如果不能,应该研究为什么你的update这么慢,例如你是否没有使用索引去查找,你是否应该将同步触发器改为异步执行的程序。
      

  5.   

    那么即使你使用transaction  -->  那么即使你不使用transaction
      

  6.   

    查一查 update 的效率,如果update 慢,你需要优化你的数据库。在线一般不会超过10W吧,10W以下的表,插入应该非常快的,如果比较慢,你查查这方面的原因。
      

  7.   

    我的update非常简单啊 单独拿出来速度肯定非常快我现在只能是猜测是并发造成锁死的想找出原因 确没有好的办法 怎么才能找到锁死的地方或者原因呢?
      

  8.   

    如果是SQL Server,你仅仅执行一条update命令,锁记录是逻辑正常的,不正常的只有可能是查找定位记录的速度太慢造成锁的时间过长。
      

  9.   

    to sp1234(脸上不少死皮) 感觉非常快的意思是说 那个update语句很简单 所操作的表也很简单 而且记录不是很多我的意思主要是想找到这种死锁问题的方法 和一般解决办法 我现在网站有时候sqlserver的cpu占用很高 经常造成网站访问非常卡应该怎么解决呢?从那方面入手解决呢?
      

  10.   

    1.用缓存
    2.用事件探查器来看看哪些查询语句耗资源,然后优化查询
    3.给数据库服务器加cpu,加内存
      

  11.   

    慢也不一定就是那条UPDATE语句造成的,也许你的程序里其它地方代码有问题,一个很典型的例子就是连接池满了,检查一下是否所有的连接都显示的关闭或Dispose了。
    另外,还可以用缓存来减少数据库的压力。其实用户所在页面也不需要非常实时,可以考虑换种方式,把用户在线列表放到缓存中,每个请求只更新缓存中的数据,然后定个时间,比如5秒,把缓存中的在线列表更新到数据库,这样就不需要每次都向数据库里请求更新了。
      

  12.   

    我的update非常简单啊 单独拿出来速度肯定非常快我现在只能是猜测是并发造成锁死的想找出原因 确没有好的办法 怎么才能找到锁死的地方或者原因呢?
    ------------------------------------------------------------------
    看看 Update语句是否异常,在数据库里有没有为每一个用户分配一条记录?
    你应该为每个用户分配一条记录,然后再更新这条记录。
    更新尽量用存储过程。
    下一个数据库压力测试工具,看看你的数据库是不是真的很快;
      

  13.   

    c#自带了事务啊
    可以使用sqltransaction类啊,用法和transaction差不多,然后使用lock语句锁一下就好了
    个人意见,没有试过
      

  14.   

    我看楼主对“死锁”的概念用的比较宽泛,把速度慢都叫做死锁,并不是真的update异常。在数据量很大,而操作仅仅是更新一条记录这么简单的时候,似乎只有索引问题才会如此。有能够用的索引,当数据从1000条增加到100万条的时候,也仅仅多花几倍的时间,而没有能够用的索引则会多花几十万倍的时间查找定位。你可以使用线程将记录操作变为异步的,这可以让程序看起来快很多。但是如果不解决结构问题,你的服务器整体性能很低,最终也还是不好。
      

  15.   

    我的数据库链接池 没有几个很少 一般保持在4-6个 事件探测器 没有费时的sql语句死锁的概念可能我理解错了 但是在sqlserver管理器中的 锁/id 里面有很多条 大部分都是online表的sql语句 一般是 delete from online where sessionid='XXXXX' 
    这个表主要就是添加 删除 和select 而且 极少有可能同时添加 删除 select的 我现在就是不知道系统到底是那里的事情 为啥经常卡 cpu 一般都是忽高忽低 偶尔还会cpu到100好长时间不下来郁闷的很啊 除了数据库死锁的问题 实在是找不到其他的问题了服务器ping值都是<=1ms 的 啊