我的网络应用程序连接到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
存储过程何时退出?
答案 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.
}
}
}
}
肯定会提交任何未完成的交易。