如:
BEGIN TRAN
SELECT * FROM [TABLE] WITH(XLOCK) WHERE ...
没了, 没有COMMIT, 这样, 这两句执行以后, 这个事务就一直没办法结束, 怎么才能检测这种情况,
并强行结束这个事务?
另外,在程序里面两次或多次执行SQL 语句, 有办法把它们放进一个事务里吗?
如:
先用SELECT 查询, 然后在程序里对查询结果做处理, 再用UPDATE 语句更新数据库, 前后两个动作(SELECT+UPDATE) 能放进一个事务里吗?谢谢!

解决方案 »

  1.   

    BEGIN TRAN
    SELECT * FROM [TABLE] WITH(XLOCK) WHERE ...
    没了, 没有COMMIT, 这样, 这两句执行以后, 这个事务就一直没办法结束, 怎么才能检测这种情况,
    并强行结束这个事务?
    ----------------------------------------------------------------
    使用@@trancount检测一下,如果大于0则说明当前连接中有事务在执行.
    if @@trancount > 0
    rollback      /*回滚事务*/
      

  2.   

    另外,在程序里面两次或多次执行SQL 语句, 有办法把它们放进一个事务里吗?
    如:
    先用SELECT 查询, 然后在程序里对查询结果做处理, 再用UPDATE 语句更新数据库, 前后两个动作(SELECT+UPDATE) 能放进一个事务里吗?
    ------------------------------------------------------------------------------------
    当然可以,而且有时是必要的,以保证操作要么成功要么失败.事务中最好在更新或删除语句后判断一下@@error值,如果@@error不等于0则表示上一个语句出错,要进行回滚.例如:
    begin tran
    select ...
    update ...
    if @@error <> 0
        rollback
    else
        commit tran
      

  3.   

    谢谢 hellowork(一两清风) !不过好像是我没达清楚... 再看一遍我的原贴, 觉得真晕, 第二个问题一点都没说清楚.我第二个问题的意思是, 在高级语言里, 而不是SQL 程序段里分两次执行:
    [c#]
    string sql="begin tran select..."
    //执行sql, 返回结果给一个string变量result
    if (result==xx)
    sql="commit tran";
    else
    sql="rollback tran";像这样的语句, 我当时不知道可以commit 一个分段事务的主体是什么, 
    现在已经知道是连接了, 所以上述代码应该是可以执行的, 前提是前半段
    sql的连接不能关闭.