我应该提交或回滚创建临时表的事务,读取,然后删除它吗?

时间:2010-05-21 00:54:39

标签: sql-server-2008 transactions commit effects rollback

要选择与数百个ID列表相关的信息...而不是制作一个巨大的select语句,我创建临时表,将id插入其中,将其与表连接以选择与ID匹配的行,然后删除临时表。所以这实际上是一个读操作,没有对任何持久数据库表进行永久性更改。

我在一个事务中执行此操作,以确保在完成时删除临时表。我的问题是......当我进行这样的交易时会发生什么情况而不是让它回滚?

性能方面......数据库引擎是否需要做更多工作来回滚事务与提交事务?因为对临时表进行了唯一的修改,所以是否存在差异?

此处有相关问题,但未回答涉及临时表的特定案例:Should I commit or rollback a read transaction?

编辑(问题澄清):

不寻找提交/回滚的建议。交易绝对必要。假设没有错误发生。假设我已经创建了一个临时表,假设我知道写入tempdb的实际“工作”已经发生,假设我在事务中执行只读(select)操作,并假设我在临时表上发出了一个delete语句。毕竟...更便宜,提交或回滚,为什么?基于涉及临时表和其他只读操作的特定方案,db引擎可以在THAT POINT执行提交与回滚的其他工作吗?

2 个答案:

答案 0 :(得分:3)

如果我们讨论的是本地临时表(即名称以单个#为前缀),那么当您关闭连接时,SQL Server将终止该表。因此,假设您的数据层设计得很好,以便尽可能短的时间保持连接打开,我不会担心在事务中包含临时表的创建。

我认为在交易中包装表可能会有轻微的性能差异,但我敢打赌,与保持交易开放时间较长的成本相比,由于创建和填充交易的时间长,这个数据是无关紧要的。临时表。

答案 1 :(得分:0)

确保删除临时表的一种更简单的方法是使用#符号创建它。

CREATE TABLE #mytable( rowID int, rowName char(30))

#告诉SQL Server该表是本地临时表。此表仅对此SQL Server会话可见。会话关闭时,表将自动删除。您可以像处理任何其他表一样处理此表,但有一些例外。唯一真正的主要问题是您不能在临时表上使用外键约束。其他内容包含在联机丛书中。

临时表在tempdb中创建。

如果您这样做,则不必将其包装在交易中。