小编joj*_*ojo的帖子

更新锁的用途

我正在阅读了解 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)

sql-server deadlock locking

4
推荐指数
1
解决办法
5952
查看次数

DateTime表示C#中的位数

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?

c# memory datetime

4
推荐指数
1
解决办法
2123
查看次数

为什么Len功能可以使用索引?

我有一个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次)?

sql-server clustered-index non-clustered-index

4
推荐指数
1
解决办法
308
查看次数

是否有命令从当前行跳转第N行?

例如,当我在3000线上时跳到4000线.也许有些命令就像

:goto next 1000G
Run Code Online (Sandbox Code Playgroud)

vim

3
推荐指数
1
解决办法
2255
查看次数