如:
BEGIN TRAN
SELECT * FROM [TABLE] WITH(XLOCK) WHERE ...
没了, 没有COMMIT, 这样, 这两句执行以后, 这个事务就一直没办法结束, 怎么才能检测这种情况,
并强行结束这个事务?
另外,在程序里面两次或多次执行SQL 语句, 有办法把它们放进一个事务里吗?
如:
先用SELECT 查询, 然后在程序里对查询结果做处理, 再用UPDATE 语句更新数据库, 前后两个动作(SELECT+UPDATE) 能放进一个事务里吗?谢谢!
BEGIN TRAN
SELECT * FROM [TABLE] WITH(XLOCK) WHERE ...
没了, 没有COMMIT, 这样, 这两句执行以后, 这个事务就一直没办法结束, 怎么才能检测这种情况,
并强行结束这个事务?
另外,在程序里面两次或多次执行SQL 语句, 有办法把它们放进一个事务里吗?
如:
先用SELECT 查询, 然后在程序里对查询结果做处理, 再用UPDATE 语句更新数据库, 前后两个动作(SELECT+UPDATE) 能放进一个事务里吗?谢谢!
SELECT * FROM [TABLE] WITH(XLOCK) WHERE ...
没了, 没有COMMIT, 这样, 这两句执行以后, 这个事务就一直没办法结束, 怎么才能检测这种情况,
并强行结束这个事务?
----------------------------------------------------------------
使用@@trancount检测一下,如果大于0则说明当前连接中有事务在执行.
if @@trancount > 0
rollback /*回滚事务*/
如:
先用SELECT 查询, 然后在程序里对查询结果做处理, 再用UPDATE 语句更新数据库, 前后两个动作(SELECT+UPDATE) 能放进一个事务里吗?
------------------------------------------------------------------------------------
当然可以,而且有时是必要的,以保证操作要么成功要么失败.事务中最好在更新或删除语句后判断一下@@error值,如果@@error不等于0则表示上一个语句出错,要进行回滚.例如:
begin tran
select ...
update ...
if @@error <> 0
rollback
else
commit tran
[c#]
string sql="begin tran select..."
//执行sql, 返回结果给一个string变量result
if (result==xx)
sql="commit tran";
else
sql="rollback tran";像这样的语句, 我当时不知道可以commit 一个分段事务的主体是什么,
现在已经知道是连接了, 所以上述代码应该是可以执行的, 前提是前半段
sql的连接不能关闭.