以下tsql代码有什么问题

时间:2016-08-04 06:31:32

标签: sql sql-server sql-server-2008 tsql

margin: 0 auto;
display: block;
max-width: 100%;

我知道这里不需要事务,因为它只是一个选择,但只是想知道编程有多糟糕,以及它是否会成为数据库引擎的开销。

3 个答案:

答案 0 :(得分:2)

您可以在else语句上使用事务,以确保在执行一堆选择查询时,没有其他人可以更新/删除表的记录。

使用 WITH(NOLOCK)

无论如何,您也可以将 SELECT 用于t_sql

<强> WITH(NOLOCK)

SELECT * FROM AnySchema.AnyTable WITH(NOLOCK) WHERE AnyColumn = SomeCondition 相当于将 READ UNCOMMITED 用作事务隔离级别。此处存在读取随后回滚的未提交行的风险,即从未进入数据库的数据。 因此,虽然它可以防止读取被其他操作陷入僵局,但它会带来风险。

交易 阻止:

使用WITH (NOLOCK)阻止不会导致 大部分 额外的数据库重载,但是如果您在任何SQL块上保持相同的类型练习并假设忘了(你/你的开发人员可能会忘记,对吗?)关闭事务,然后其他进程无法在同一个表上工作。

无论如何, 取决于您使用的应用程序类型 。如果非常频繁TRANSACTIONupdate,则建议不要使用此类事务块。如果存在中等级别的更新和选择,则彼此相邻,您可以使用select的事务块(但确保关闭事务)。

答案 1 :(得分:0)

这实际上是一个很好的问题。要了解发生了什么,您需要了解SET IMPLICIT_TRANSACTIONS

  

启用时,系统处于隐式事务模式。这意味着如果@@ TRANCOUNT = 0,则以下任何Transact-SQL语句都会开始一个新事务。它相当于首先执行的看不见的BEGIN TRANSACTION:

     

当OFF时,前面的每个T-SQL语句都由一个看不见的BEGIN TRANSACTION和一个看不见的COMMIT TRANSACTION语句限制。当OFF时,我们说交易模式是自动提交。 [这是默认设置]

     

如果您的T-SQL代码明显发出BEGIN TRANSACTION,我们说交易模式是明确的。

https://msdn.microsoft.com/en-us/library/ms187807.aspx

由于SQL Server会为您创建一个事务,因此手动执行并不会实际更改任何内容。无论哪种方式都会发生同样的事情。

总结:你在做什么并不是错误的&#39;因为它没有效果,但对读者来说是不必要的和混乱的。

答案 2 :(得分:0)

我认为你会陷入困境,很可能是一个障碍物 table hints

这并不总是一件好事,因为你会阻止任何更新或删除(甚至插入)

最好让SQL决定要采取什么级别的锁。最有可能的是页锁。因为糟糕的事情会发生,我会远离nolock。

在单个表上的选择中,让优化程序执行此操作。