sqlserver开事务与不开事务的区别

sqlserver开事务与不开事务的区别,第1张

概述又看到一篇好文章,原来sql server执行一条sql的时候,是默认打开事务的,执行完后都会执行一次commit *** 作,这样如果执行多次,就会大大地降低性能。所以开事务后,只在最后执行完并且成功时commit一次,因而加快速度。高手的测试在下面。   昨天在测试一段批量插入记录的数据库 *** 作时,发现开启事务与否对性能影响很大,根据当时的环境,测试有6倍差距. 分别测试插入500条/5000条/500 又看到一篇好文章,原来sql server执行一条sql的时候,是默认打开事务的,执行完后都会执行一次commit *** 作,这样如果执行多次,就会大大地降低性能。所以开事务后,只在最后执行完并且成功时commit一次,因而加快速度。高手的测试在下面。   昨天在测试一段批量插入记录的数据库 *** 作时,发现开启事务与否对性能影响很大,根据当时的环境,测试有6倍差距.

分别测试插入500条/5000条/50000条,

开启事务时分别为480毫秒/4546毫秒/47407毫秒

不开事务时分别为3100毫秒/30859毫秒/308802毫秒
这是什么原因呢?仔细分析一下,这个应该跟sqlServer的后台内存管理和数据存取机制相关。

    当我们提交数据到服务器时,sqlServer会按如下顺序进行 *** 作:

        1)复制数据到内存;2)书写 *** 作日志;3)保存数据到磁盘数据文件中。

    这三步 *** 作中,1和2的效率都比较高(内存书写自不必说,日志书写是顺序书写,不需要复杂校验,故也比较快),

    但第三步写入磁盘数据文件的 *** 作就非常耗时间了。(需要验证,更新索引等)

OK,我们来解释一下两种情况的差别:

1、当我们在未开启事务的情况下执行一条(仅一次插入)插入语句时,默认sqlServer会对该语句开启事务。

    在语句结束后,会进行一次自动地Commit *** 作把数据刷新到磁盘数据文件中。

    如果我们循环多次,就会占用更多系统时间。

2、在开启事务的情况下,我们只有最后一次Commit *** 作,并且一旦书写 *** 作日志成功,系统就会报告提交成功。(其实此时后台还正在往磁盘数据文件中刷新数据)。

总结:因为刷新磁盘数据文件是串行化的,因此应该减少Commit的次数,而开启事务是比较好的选择。否则默认事务就要不停的Commit,占用我们宝贵的时间资源。
附测试代码:
static voID TestBatchInsert()
    {
        using (IConnectionHelper ch = new ConnectionHelper())
        {
            long t = DateTime.Now.Ticks;
            try
            {
                ch.BeginTransaction();               
                for (int i = 0; i < 5000; i++)
                {
                    XML_COMPANYEntity ce = new XML_COMPANYEntity();
                    ce.SetNextMaxValue(ch);
                    ce.XCM_name = "Eric.Zhang" + i.ToString();
                    ce.XCM_ADDRESS = "HangZhou" + i.ToString();
                    ce.InsertEntity(ch);
                }
                ch.CommitTransaction();
            }
            catch
            {
                ch.RollbackTransaction();
                throw;
            }
            TimeSpan ts = new TimeSpan(DateTime.Now.Ticks - t);
            Console.Writeline(ts.TotalMilliseconds);
        }
    }
原文出处: http://www.cnblogs.com/applexml/articles/1096740.html 谢原作者分享! 总结

以上是内存溢出为你收集整理的sqlserver开事务与不开事务的区别全部内容,希望文章能够帮你解决sqlserver开事务与不开事务的区别所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1178096.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存