在事务中包装随机即席查询真的有什么好处吗?

Mat*_*att 2 sql-server

我不是数据库专家,但是当在我们客户公司工作的人要求我们发送包含在如下交易中的所有查询时,我感到非常惊讶:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRANSACTION;
    SELECT * FROM <table_name> WHERE ..etc
COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)

在我们所做的只是读取数据(随机即席查询)之前,我从未有过这样的请求。这有什么意义吗?谁能告诉我为什么这是必要的?

非常感谢

db2*_*db2 5

在这种特定情况下,BEGIN TRANSACTION/COMMIT TRANSACTION语句大多是多余的。

至于以READ UNCOMMITTED隔离级别运行所有查询,我强烈建议不要这样做,除非您有特定需求,并且不担心脏读的影响:

  • 您最终可能会从半完成的交易中查询数据(例如,只有复式会计分类账条目的一半,只有订单的部分行项目等)
  • 您最终可能会从最终回滚的事务中查询数据。

如果您担心写入查询会阻塞读取查询,我建议您使用SNAPSHOT隔离或设置READ_COMMITTED_SNAPSHOT数据库选项,这样可以有效地对所有查询使用快照隔离。最终结果是,读取查询不会被阻塞,而是会看到在任何当前运行的写入事务之前就存在的数据。

请注意,此选项会增加 tempdb 的使用,因为这是存储快照数据的位置(并且必须将其存储在启用它的数据库中的所有写入事务中)。如果这种开销是不可接受的,那么我只会READ UNCOMMITTED在逐案评估需要它的查询后使用。

我知道你不是决定使用它的人,但如果你需要推迟它,你可以使用这些点作为弹药。:)