sql-server – DB锁需要事务吗?

“每个语句(选择/插入/删除/更新)是否具有隔离级别而不管事务”是真的吗?

我有一个场景,我在事务中设置了语句更新(ReadCommitted).
而另一组不在事务中(select语句).

>在这种情况下,当第一组执行时,另一个等待.
>如果我设置READ_COMMITTED_SNAPSHOT用于DB死锁发生.

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中,并且Update查询仍然打开锁.

另一种不创建快照隔离的方法是使用SELECT< columns> FROM< table> WITH(NOLOCK)这是告诉SQL Server获取行的方法,无论如何(也就是READ_UNCOMMITED).由于它是一个查询提示,即使您的设置也会更改隔离级别.如果您不打扰查询该行的哪个状态,则可以正常工作 – 但在评估收到的数据时需要谨慎使用.

点赞