margin: 0 auto;
display: block;
max-width: 100%;
我知道这里不需要事务,因为它只是一个选择,但只是想知道编程有多糟糕,以及它是否会成为数据库引擎的开销。
答案 0 :(得分:2)
您可以在else
语句上使用事务,以确保在执行一堆选择查询时,没有其他人可以更新/删除表的记录。
使用 WITH(NOLOCK):
无论如何,您也可以将 SELECT
用于t_sql
<强> WITH(NOLOCK)
强>
SELECT * FROM AnySchema.AnyTable WITH(NOLOCK)
WHERE AnyColumn = SomeCondition
相当于将 READ UNCOMMITED 用作事务隔离级别。此处存在读取随后回滚的未提交行的风险,即从未进入数据库的数据。
因此,虽然它可以防止读取被其他操作陷入僵局,但它会带来风险。
交易 阻止:
使用WITH (NOLOCK)
阻止不会导致 大部分 额外的数据库重载,但是如果您在任何SQL块上保持相同的类型练习并假设忘了(你/你的开发人员可能会忘记,对吗?)关闭事务,然后其他进程无法在同一个表上工作。
无论如何, 取决于您使用的应用程序类型 。如果非常频繁TRANSACTION
和update
,则建议不要使用此类事务块。如果存在中等级别的更新和选择,则彼此相邻,您可以使用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。
在单个表上的选择中,让优化程序执行此操作。