我正在阅读了解 SQL Server 中的锁定。但不太明白更新锁的用途。
详细说明如下:
更新锁
更新 (U) 锁可防止常见形式的死锁。典型的更新模式包括事务读取记录、获取资源(页或行)上的共享 (S) 锁,然后修改该行,这需要将锁转换为排他 (X) 锁。如果两个事务获取资源上的共享模式锁,然后尝试同时更新数据,则一个事务会尝试将锁转换为排它 (X) 锁。共享模式到排它锁的转换必须等待,因为一个事务的排它锁与另一个事务的共享模式锁不兼容;发生锁等待。第二个事务尝试为其更新获取独占 (X) 锁。由于两个事务都转换为排它 (X) 锁,并且它们都在等待另一个事务释放其共享模式锁,因此会发生死锁。
为了避免这种潜在的死锁问题,使用更新(U)锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁将转换为排他 (X) 锁。否则,锁将转换为共享模式锁。
考虑下面两个事务(两个事务都执行Isolation Level Repeatable Read以在事务期间保持 S 锁):
在 TRAN1 中执行以下 SQL。
BEGIN TRAN
SELECT BrandName FROM dbo.Brand WHERE BrandId=2
Run Code Online (Sandbox Code Playgroud)
现在,TRAN1 为 RID 授予 S 锁
在 TRAN2 中执行以下 SQL
BEGIN TRAN
SELECT BrandName FROM dbo.Brand WHERE BrandId=2
Run Code Online (Sandbox Code Playgroud)
现在,TRAN2 为与 TRAN1 相同的 RID 资源授予 S 锁
在 TRAN1 中执行以下 SQL
UPDATE dbo.Brand …Run Code Online (Sandbox Code Playgroud) Int,Float,Double,Decimal,DateTime .etc是值类型.而且我知道:
Int:Represents a 32-bit signed integer.
Float:Represents a single-precision floating-point number(32-bit).
Double:Represents a double-precision floating-point number(64-bit).
...
Run Code Online (Sandbox Code Playgroud)
但DateTime有多少位?为什么.NET中的所有值类型都是struct?
我有一个145000行的表.并没有任何索引.
当我在sql下运行时.我按预期在执行计划上找到了表扫描.它生成六行和3481逻辑读取.
SET STATISTICS IO ON
SELECT columnA FROM table WHERE LEN(columnA)<>5
Run Code Online (Sandbox Code Playgroud)
然后我在columnA上添加一个聚簇索引并运行sql.I在执行计划中找到一个集群索引扫描.它生成六行和3511逻辑读取.我可以理解B树节点读取的更大逻辑读取.
但令我困惑的是,我在columnA上使用非聚集索引而不是聚簇索引并运行sql.我在执行计划上找到了索引扫描.它生成六行,只需要417个逻辑读取!
我不认为len()函数可以利用索引.但是为什么columnA上的非聚集索引会减少逻辑读取次数(9次)?