Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该在读取记录时使用SQL事务吗?_C#_Sql_Sql Server 2005 - Fatal编程技术网

C# 我应该在读取记录时使用SQL事务吗?

C# 我应该在读取记录时使用SQL事务吗?,c#,sql,sql-server-2005,C#,Sql,Sql Server 2005,SQL事务用于插入、更新,但是否应用于读取记录?纯读取不需要事务包装 在SQL语句中,锁提示应该注意将正确的数据返回给您() 在服务器级别上,可以设置事务隔离级别() 编辑 解释纯阅读 如果所有SQL语句都有这些类型的读取,那么不需要在事务中进行包装 SELECT Col1, Col2 From Table1 INNER JOIN Table2 ON Table1.Id = Table2.Table1Id 如果您正在读取可能受其他并行事务影响的结果,则必须将其包装在事务

SQL事务用于插入、更新,但是否应用于读取记录?

纯读取不需要事务包装

在SQL语句中,锁提示应该注意将正确的数据返回给您()

在服务器级别上,可以设置事务隔离级别()

编辑

解释纯阅读

如果所有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

实际上,您只是返回余额,但整个货币交易必须在两个位置工作。

如果您需要最新的毫秒信息,您可以使用由
TransactionOptions
构成的交易,该交易具有可序列化的
属性

这会影响性能,因为它会锁定表(或表的一部分),因此您需要确定是否确实需要它

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

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


例如,如果您执行读取操作,并根据结果执行写入或更新操作,但刚刚读取的数据必须是最新的,这一点很关键,您可能应该将整个逻辑包装到一个事务中。

如果您在一次查询中查询所有记录,并一次性将其收回,则无需执行此操作。所有内容都包含在一个隐式事务中。也就是说,即使您返回一百万条记录,即使其他进程正在更改这些记录,您也会看到所有一百万条记录在同一时间点上的样子

在只读进程中,您真正需要事务(通常还需要特定的锁定提示)的时间只有:
-你读了“零碎的”记录,不需要其他任何东西来改变这些值。[例如,在ADO中连接的记录集,然后将光标移到其中。]
-你读了一些数据,做了一些计算,然后读了一些相关的数据,但假设在此期间没有任何变化



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

否,通常不需要事务来读取数据,它也会降低您的数据读取速度


我建议你仔细阅读原子这个术语。这将帮助您了解事务的用途。

进行事务是可能的,但它的目的是什么

您可以使用set TRANSACTION isolation level语句为整个SQL Server会话设置适当的隔离级别

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

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

.

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

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

在下面的示例中,任何并发进程都可能干扰正在读取的表。没有数据写入,但相关读取之间有计算。因此,需要使用这种事务来保护数据的状态。插入@temp SELECT;选择;但这不是一本纯粹的读物。Raj说“纯读取不需要事务包装。”定义“纯读取”,我给出的示例不插入、更新或删除变量以外的任何内容。[它可以是一个INT、一个表变量或其他一些数据容器,以便于计算,然后定义最终读取的行为]您正在修改结构调用@temp。这是一个INSERT语句,不是一个纯读取语句,特别是当@temp用于后面的
SELET
语句时。但是从黑盒的角度来看,数据库中没有任何更改。例如,可以在用户定义的函数中使用临时变量。根据“纯读”的定义,您甚至不能使用INT变量,因此我认为您仅限于一条SQL语句。我想说的是,“纯读”实际上描述了一个不会对数据库或其内容造成任何(临时或永久)更改的过程,无论它们对任何其他进程是否可见。在我看来,要求甚至不使用变量描述了一个过于琐碎的场景。感谢所有的回答者,我希望有选项将所有标记为答案,但没有。感谢您提供示例,感谢您提供锁定说明的链接,感谢您解释如何在毫秒内获取最新数据,谢谢。