SQL事务用于插入,更新,但是它应该用于读取记录吗?
答案 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
}
答案 5 :(得分:0)
当您在事务中修改某些内容时,可以在提交之前使用read语句检查操作是否生效。
答案 6 :(得分:0)
当一个逻辑事务实际映射到多个SQL查询时,事务旨在避免并发问题。例如,对于银行帐户,如果您要将资金从一个帐户转移到另一个帐户,您将从帐户中减去该金额,然后将其添加到其他帐户(反之亦然)。但是,如果您的数据库之间发生某些错误,则处于无效状态(您可能已从一个帐户中减去该金额但未将其添加到其他帐户)。因此,如果您在一个查询中阅读所有数据,则不需要进行交易。