在阅读记录时我应该使用SQL事务吗?

时间:2010-06-21 13:35:15

标签: c# sql sql-server-2005

SQL事务用于插入,更新,但是它应该用于读取记录吗?

7 个答案:

答案 0 :(得分:8)

如果您在一个查询中查询所有记录,并且一次性将它们拉回来,则没有必要。一切都包含在隐式事务中。也就是说,即使您收回了一百万条记录,即使其他进程正在更改记录,您也会看到同一时间点上所有一百万条记录的内容。

在只读过程中,您真正需要事务(并且通常是特定的锁定提示)的唯一时间是:
- 你读了“吃饭”的记录,并且在你尝试的时候不需要改变价值。 [例如ADO中的连接记录集,然后光标通过。]
- 您读取了一些数据,进行了一些计算,然后读取了一些相关数据,但假设平均时间没有任何变化。


简而言之,当您希望停止其他进程在SQL语句之间干扰数据时,您需要事务。

答案 1 :(得分:3)

纯读取不需要事务包装。

在您的SQL语句中,Lock Hints应该注意向您返回正确的数据(http://msdn.microsoft.com/en-us/library/aa213026%28SQL.80%29.aspx)。

在服务器级别,您可以设置事务隔离级别(http://msdn.microsoft.com/en-us/library/ms173763.aspx)。

修改

解释纯读取

如果所有SQL语句都有这些类型的读取,那么您不需要包装事务

SELECT Col1, Col2
From Table1
    INNER JOIN Table2
        ON Table1.Id = Table2.Table1Id

如果您正在读取可能受其他并行事务影响的结果,那么您必须包装一个事务。例如:

BEGIN TRANSACTION

INSERT INTO AccountTransactions (Type, Amount) Values ('Credit', 43.21)
UPDATE AccountSummary SET Balance = Balance + 43.21

SELECT @Balance = Balance FROM AccountSummary

COMMIT TRANSACTION

真的,你刚刚收回余额,但整个货币交易必须在两个地方工作。

答案 2 :(得分:2)

如果您需要最新的毫秒信息,则可以使用由TransactionOptions Serializable {{1}}构建的交易。

这会影响性能,因为它会锁定表格(或表格的某些部分),所以你需要弄清楚你是否真的需要它。

对于大多数用途,如果您正在进行读取,则不需要在其周围包装事务(假设您只在一次操作中进行读取)。

这实际上取决于您的应用程序,它需要什么数据以及它如何使用它。

例如,如果您执行读取操作并根据结果执行写入或更新,但是您刚刚读取的数据是最新的至关重要,您应该将整个逻辑包装到单个事务中。

答案 3 :(得分:1)

不,通常不需要事务来读取数据,也会减慢数据读取速度。

我建议你阅读ATOMIC一词。这有助于您了解交易的目的。

答案 4 :(得分:1)

做交易是可能的,但它的目的是什么?

您可以使用SET TRANSACTION ISOLATION LEVEL语句为整个SQL Server会话设置适当的隔离级别。

这是SQL Server联机丛书的语法:

SET TRANSACTION ISOLATION LEVEL 
    {
        READ COMMITTED 
        | READ UNCOMMITTED 
        | REPEATABLE READ 
        | SERIALIZABLE
    }

Locking in Microsoft SQL Server

答案 5 :(得分:0)

当您在事务中修改某些内容时,可以在提交之前使用read语句检查操作是否生效。

答案 6 :(得分:0)

当一个逻辑事务实际映射到多个SQL查询时,事务旨在避免并发问题。例如,对于银行帐户,如果您要将资金从一个帐户转移到另一个帐户,您将从帐户中减去该金额,然后将其添加到其他帐户(反之亦然)。但是,如果您的数据库之间发生某些错误,则处于无效状态(您可能已从一个帐户中减去该金额但未将其添加到其他帐户)。因此,如果您在一个查询中阅读所有数据,则不需要进行交易。