“无论事务如何,每个语句(选择/插入/删除/更新)都具有隔离级别”是真的吗?
我有一个场景,我在事务中设置了语句更新(ReadCommitted)。
另一个不在事务中的集合(选择语句)。
ALTER DATABASE Amelio SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE Amelio SET READ_COMMITTED_SNAPSHOT ON
要解决这个问题,是否需要在 TransactionScope 中放置“Select”语句?
最佳答案
在 SQL Server 上,每个事务都有一个隐式或显式的事务级别。如果使用 BEGIN/COMMIT/ROLLBACK TRANSACTION
调用则显式, 如果没有发出类似的内容,则隐式。
在更新查询开始之前启动您的快照。否则,SQL Server 没有机会将更改的行准备到 tempdb 中,并且更新查询仍然打开锁。
另一种不创建快照隔离的方法是使用 SELECT <columns> FROM <table> WITH (NOLOCK)
这是告诉 SQL Server 无论如何都要获取行的方法(又名 READ_UNCOMMITED)。由于它是查询提示,因此即使使用您的设置,它也会更改隔离级别。如果您不担心查询行的哪个状态,则可以工作 - 但是在评估收到的数据时需要谨慎。
关于sql-server - DB锁需要事务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2205231/