有一个问题?

如果您有任何疑问,可以在下面询问或输入您要查找的内容!

Sql 锁和事物隔离级别

### sql 锁分为:

 1. 共享锁

 2. 排它锁

锁的兼容:

  - 已被排它锁的持有的资源不可再被其它任务锁访问

  - 已被贡献锁持有的资源可以被其它共享锁访问,但不可以被排它锁访问

> sql锁定资源的单位有: 行,页,库,对象(如表)等


### 事物隔离级别分为:

 1. 悲观并发控制

     - read uncommitted   // 无锁,读取者可以读到写入者尚未提交的更改。导致脏读。 编码可简写为 with(nolock)

     - read committed (default)  // 共享锁,读取者必须获取一个锁以防止读取到未提交的数据。但该锁不会持续到事物结束,同一事务2次查询可以在查询间隙更新资源导致查询结果不一致。该级别锁也可能导致更新丢失

     - repeatable read  // 共享锁,读者必须获取一个锁持续到事务结束。该隔离级别只会锁定执行查询语句时符合查询条件的资源

     - serializable   // 共享锁,该隔离级别不仅锁定执行查询语句时符合查询条件的数据行,也会锁定将来可能用到的数据行

 2. 乐观并发控制

     - snapshot   // 它是确保获得事务启动时最近提交的可用行版本

     - read commit snapshot (default)  // 该隔离级别与SNAPSHOT的不同之处在于,读取者获得是语句启动时(不是事务启动时)可用的最后提交的行版本


### 关于死锁

 对于死锁,SQL Server会自行清理。默认情况下,SQL Server会选择终止工作量少的事务以解除死锁,因为工作量少便于事务的回滚操作。用户也可以设置死锁优先级DEADLOCK_PRIORITY,这样优先级低的便被终止,而不管其工作量大小。


### 结语

SQL Server中提供了四种不依赖行版本控制的事务隔离级别,及两种依赖行版本控制的事务隔离级别。不同事务的隔离级别会对数据查询语句的执行过程(是否获取共享锁,语句是否会被阻塞)及结果(是否有脏读、幻读等)产生较大的影响,对于修改数据行为的影响仅限于是否会阻塞语句的执行,因为修改数据的语句必须要获取排它锁才能被执行。错误之处望各位多多指教。







发表评论