加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL Server复制怎么达成大事务划分小事务

发布时间:2023-06-09 11:13:32 所属栏目:MsSql教程 来源:
导读: 在sql server 复制中,当在发布数据库执行1个大事务时,如一次性操作 十万或百万以上的数据。当操作数据在发布数据库执行完成后 ,日志读取器代理将扫描事务日志,一次性传递到分发数据库中。若上个事务未传递完成

  在sql server 复制中,当在发布数据库执行1个大事务时,如一次性操作 十万或百万以上的数据。当操作数据在发布数据库执行完成后 ,日志读取器代理将扫描事务日志,一次性传递到分发数据库中。若上个事务未传递完成,连续执行多个事务,日志读取器代理将扫描日志中多个事务同时传递到分发数据库中,默认最大扫描500个事务。如果执行多次上百万或千万的数据将堵塞很久。

    日志读取器代理可配置将大事务划分为多个小事务进行传递到分发数据库中,分发队列则按照小事务分发到订阅数据库中,这样数据就很快同步!

    可以看到,这1个事务的命令都得一次传递完才能分发,而分发又消耗时间,这里等待太久影响事务的实时性。

    如果还有其他事务,默认500(参考参数:-ReadBatchSize),也将一起传递,耗时较长。

    现在更改参数,扫描到 1000 左右的命令就即时分发,需要设置如下参数:

    -MaxCmdsInTran number_of_commands

    注:该参数只能添加到日志读取器代理中,在代理配置文件没有此参数的设置。

    添加后重启 日志读取器代理。

    再次插入 30 万的数据!~到监视器查看

    可以看到,命令达到 1000 左右就进行分发了,此时查看订阅数据库,数据也同步过来了,这样就省去了较多扫描命令的时间。

    更详细查看每个事务的命令数,如下:

SELECT top 10 A.xact_seqno,A.entry_time,COUNT(*) AS cmds

FROM distribution.dbo.MSrepl_transactions A(NOLOCK)

INNER JOIN distribution.dbo.MSrepl_commands B(NOLOCK)

ON A.xact_seqno=B.xact_seqno

GROUP BY A.xact_seqno,A.entry_time

ORDER BY cmds DESC

    这个参数虽好,但是也可能引起数据的一致性。

    如:

    在发布更新了一批数据,但是订阅查询时却有不同。

    分发事务遇到冲突或者死锁,也导致这部分的数据不一致。

    参考:复制日志读取器代理

以上就是关于“SQL Server复制怎么实现大事务划分小事务”的相关知识,感谢各位的阅读。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章