没有实现的处理说明,只能从理论上去说,其实联机帮助上就有:将死锁减至最少
虽然不能完全避免死锁,但可以使死锁的数量减至最少。将死锁减至最少可以增加事务的吞吐量并减少系统开销,因为只有很少的事务: 回滚,而回滚会取消事务执行的所有工作。
由于死锁时回滚而由应用程序重新提交。 
下列方法有助于最大限度地降低死锁: 按同一顺序访问对象。
避免事务中的用户交互。
保持事务简短并在一个批处理中。
使用低隔离级别。
使用绑定连接。 
按同一顺序访问对象
如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。例如,如果两个并发事务获得 Supplier 表上的锁,然后获得 Part 表上的锁,则在其中一个事务完成之前,另一个事务被阻塞在 Supplier 表上。第一个事务提交或回滚后,第二个事务继续进行。不发生死锁。将存储过程用于所有的数据修改可以标准化访问对象的顺序。避免事务中的用户交互
避免编写包含用户交互的事务,因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度,例如答复应用程序请求参数的提示。例如,如果事务正在等待用户输入,而用户去吃午餐了或者甚至回家过周末了,则用户将此事务挂起使之不能完成。这样将降低系统的吞吐量,因为事务持有的任何锁只有在事务提交或回滚时才会释放。即使不出现死锁的情况,访问同一资源的其它事务也会被阻塞,等待该事务完成。保持事务简短并在一个批处理中
在同一数据库中并发执行多个需要长时间运行的事务时通常发生死锁。事务运行时间越长,其持有排它锁或更新锁的时间也就越长,从而堵塞了其它活动并可能导致死锁。保持事务在一个批处理中,可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁。使用低隔离级别
确定事务是否能在更低的隔离级别上运行。执行提交读允许事务读取另一个事务已读取(未修改)的数据,而不必等待第一个事务完成。使用较低的隔离级别(例如提交读)而不使用较高的隔离级别(例如可串行读)可以缩短持有共享锁的时间,从而降低了锁定争夺。使用绑定连接
使用绑定连接使同一应用程序所打开的两个或多个连接可以相互合作。次级连接所获得的任何锁可以象由主连接获得的锁那样持有,反之亦然,因此不会相互阻塞。

解决方案 »

  1.   

    1.短信是允许有延迟的,所以你不一定要即时处理,你可以在前端程序中缓存短信信息,隔一段时间批量处理一次,这样就可以减少数据库操作的频繁程度2.所谓的低隔离级别,是指类似这样一种东西,比如,你要更新某条短信的状态,你直接用事务处理,会锁住整个表,但事实上,只需要锁定你当前要修改的这条短信的记录就行了3.绑定连接这个稍难理解一点,举个例来说:
      A程序开启了一个事务,锁住A表,在事务未提交前,B程序是不能操作A表的,但如果使用绑定连接的话,A程序在开启了一个事务后,给出一个令牌,B程序就可以拿着这个令牌,进行A程序开启的事务中进行操作A表的工作,这样,凭这个令牌,使A/B程序都处于同一个事务中.
      

  2.   

    to  zjcxc(邹建) :
    说到事务处理,我还问一下,我提交一个Update语句也算是一个事务吧?那么,我如何实现"你要更新某条短信的状态,你直接用事务处理,会锁住整个表,但事实上,只需要锁定你当前要修改的这条短信的记录就行了"呢?是不是我使用存储过程会减低事务的处理?
    另外,绑定连接如何使用呢?
      

  3.   

    to  zjcxc(邹建) :
    第一点我仔细看了一下,也不太明白.批量处理是怎么提交的?是指一次提交多个UPDATE语句吗?
      

  4.   

    批量处理就是生成类似这样的SQL
    --更新
    update 表 set status=3 where id in(1,2,3,4)--插入
    insert 表 select 值列表1
    union all select 值列表2
      

  5.   

    --绑定连接的使用示例(在查询分析器中进行)--首先创建一个测试表
    create table tb(a int)
    go--------------------------------------------------------------------------
    --------------------------------------------------------------------------
    ----------------------------------------------------------------------------不使用绑定连接的测试(a窗口)
    begin tran
    insert tb values(100)
    --开始一个新窗口(b窗口),写上如下代码并执行
    begin tran
    update tb set a=50
    rollback tran--此时的执行结果是产生的阻塞,b窗口的处理要等a窗口的处理完成后才能进行下一步
    --此时,回到a窗口,执行下面的语句,就可以解决阻塞了(这是正常阻塞)
    rollback tran
    --------------------------------------------------------------------------
    --------------------------------------------------------------------------
    --------------------------------------------------------------------------
    --使用绑定连接的测试(a窗口)
    declare @bind_token varchar(255)
    begin tran
    execute sp_getbindtoken @bind_token output
    print @bind_token --记下这个结果,后面要用到
    insert tb values(100)
    --开始一个新窗口(b窗口),写上如下代码并执行(不会产生阻塞)
    EXEC sp_bindsession 'Q[Bi.QbB\AC8\:d9kdY\UM5----;G]--'  --这个是值是上面要求记下的结果
    begin tran
    update tb set a=50
    rollback tran--回a窗口执行
    select * from tb/*--结果:此会话中的活动事务已由另外一个会话提交或终止。(所影响的行数为 0 行)
    --*/
    go--最后删除测试环境
    drop table tb