“无论事务如何”,“每个语句(选择/插入/删除/更新)都具有隔离级别”是真的吗?
我有一个场景,我在事务中设置了语句更新(ReadCommitted)。 而另一组不在事务中(select语句)。
如果我为数据库死锁设置了READ_COMMITTED_SNAPSHOT。
ALTER DATABASE Amelio SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE Amelio SET READ_COMMITTED_SNAPSHOT ON
要解决此问题,我是否需要在TransactionScope中添加“Select”语句?
答案 0 :(得分:2)
在SQL Server上,每个事务都有一个隐式或显式事务级别。如果用BEGIN/COMMIT/ROLLBACK TRANSACTION
调用则显式,如果没有发出这样的话,则隐式显示。
在更新查询开始之前启动快照。否则,您不能让SQL Server将更改的行准备到tempdb中,并且Update查询仍然会打开锁。
另一种不创建快照隔离的方法是使用SELECT <columns> FROM <table> WITH (NOLOCK)
,这是告诉SQL Server无论如何获取行的方法(也称为READ_UNCOMMITED)。由于它是一个查询提示,即使您的设置也会更改隔离级别。如果您不打扰查询该行的哪个状态,则可以正常工作 - 但在评估收到的数据时需要谨慎使用。