由非提交的事务引起的数据锁定

时间:2017-05-17 11:44:48

标签: sql-server

我的网络应用程序连接到SQL Server 2016 Express数据库,我们一直受到系统某些区域数据锁的困扰。

我的同事今天注意到,当使用KILL进程杀死长时间运行的事务时,表面上已经提交的几个事务已经回滚。

我已经在In SQL Server, how do I know what transaction mode I'm currently using?上使用@ vladV的脚本进行了检查,实际上数据库似乎处于自动提交模式。

因此,必须是数据库中的某些内容正在打开一个新事务而不是提交它。

所以我在数据库中找到了四个包含以下内容的存储过程

SET  IMPLICIT_TRANSACTIONS  ON
... code ...
IF @@TRAN_COUNT>0 COMMIT WORK

我是否正确地说,在某些/大多数情况下,即使退出存储过程,这样的存储过程也会使事务处于打开状态,并且这可能是数据锁定问题的根源?

如果是这样,那么我可以通过

来补救代码
SET IMPLICIT_TRANSACTIONS OFF 

存储过程何时退出?

1 个答案:

答案 0 :(得分:1)

  

我是否正确地说,在某些/大多数情况下,这样的存储过程会使交易保持打开状态

一些。取决于后来发生的事情。使用SQL Server中的IMPLICIT TRANSACTIONS,在运行读取数据库的查询之前,事务不会自动启动。

  

我可以通过执行SET IMPLICIT_TRANSACTIONS OFF来补救代码

没有。这不会结束任何未结交易。

请注意,COMMIT不会将@@ trancount减少为0.它会减1.它如果您有多个BEGIN TRAN语句,或者在事务隐式开始后有明确的BEGIN TRAN,那么您将需要多个COMMIT。

您可以尝试

[assembly: ExportRenderer(typeof(Label), typeof(LabelRender))]
namespace Mobile.iOS.CustomRenderers
{
    public class LabelRender: LabelRenderer
    {

        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                Control.Font = ... // Or whatever you want to change.
            }                   

        }

    }
}

肯定会提交任何未完成的交易。