例如以下语句
...
IF XXX
do sth.
RETURN
...
这个语句看似简单,但是运行会发现,运行结果不是你预想的那样。
本来我们的意图是想判断某一个条件,如果符合,就停止运行。
但是执行之后你会发现,无论IF真假与否,RETURN都会执行。
解决方案
因此需要加上BEGIN END来控制。
正确的写法
...
IF XXX
BEGIN
do sth.
RETURN
END
...
错误原因
一般IF后面有很多语句时候,我们会记住用BEGIN END,但因为一条语句,可以忽略,有时候就忘了加。
因此,最好的办法是每一个IF后面都加上BEGIN END。
错误写法
...
begin transaction
IF XXX
BEGIN
do sth.
END
ELSE
BEGIN
RETURN--错误
END
rollback
commit
...
分析
如果BEGIN一个TRAN以后直接RETURN,事务会不会回滚?
开启了事务,必须在RETURN之前回滚或者提交事务, SQL SERVER不会自动帮你处理这个。
正确写法
...
begin transaction
IF XXX
BEGIN
do sth.
END
ELSE
BEGIN
rollback
END
commit
...
延伸
在C#中,如果没有使用连接池,则事务在连接断开和销毁时被强制回滚,如果使用连接池,则事务在连接被再次使用时调用的exec sp_reset_connection存储过程清理掉。如果该连接没有被再次使用或删除,则事务一直存在,便会一直锁住相关资源不释放,照常日志变大,镜像和复制异常等情况。
参考
http://www.cnblogs.com/TeyGao/p/3522965.html
未完待续
文章来自笔者博客,使用Markdown编辑发布,原文地址:SQL Server使用常见误区