一、锁

  锁是一种安全机制,控制并发操作,防止用户读取其他用户正在更改的数据,或者多用户同时修改一个数据,从而保证事物的完整性和数据库的一致性。SQLserver 会自动强制执行锁,但是用户可以通过对锁进行了解并在应用程序中自定义锁来设计出高效率的应用程序。锁确定了并发事物访问资源的方式。

二、锁分类

共享锁:

  共享锁,锁定的资源可以被其他用户读取,但是其他用户不能听修改他(只读操作),  例如在select语句执行时,sqlserver 会对 对象进行共享锁锁定,对加共享锁的资源读取完毕之后,共享锁立即释放。(对于事物级别中 repeattable read,是这样的,在一个事物中,select 语句获取共享锁,查询完之后,不会释放共享锁,只有等到事物结束才会释放共享锁。)

排他锁:

  排它锁只允许锁定他的程序操作他。其他任何操作都不会被接受。例如执行update insert delete时sqlserver会自动是用排他锁,确保不会同时对一个资源多种操作。当对象上有其他锁时,无法对资源添加排它锁(这个也是事物中read commited 原理)。排它锁一直到事物结束才释放。

更新锁:

  用户更新资源时,防止死锁。

  下面是死锁现象

                              

  上面两个相同的事物同时执行,同时获取共享锁,  当他们更新的时候需要获取排它锁,但是由于其他事物存在其他类型的锁,不能使用排它锁,导致锁等待,都在等待另外一个事物释放共享锁。导致锁死。

  更新锁,可以防止死锁问题。因为一次只能有一个事物获取资源的更新锁,其他事物只能获得共享锁。sqlserver准备更新数据时,首先对资源添加更新锁,这样其他事物不能修改,只能读取。等到sqlserver确定要更新资源时,自动将更新锁转换为排它锁,否则锁转化为共享锁。

三、事物级别
CREATE DATABASE Test
GO
USE [Test]
GO
/****** Object: Table [dbo].[UserTable] Script Date: 2017/7/20 14:00:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[UserTable](
[UserID] [int] IDENTITY(,) NOT NULL,
[UserName] [nvarchar]() NULL,
[NewClo] [int] NULL,
CONSTRAINT [PK_UserTable] PRIMARY KEY CLUSTERED
(
[UserID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO

数据库初始化脚本

  四种常用级别,由低到高。设置事物级别   SET TRANSACTION ISOLATION LEVEL  +  事物级别。默认事物级别为READ COMMIT

READ UNCOMMITED(未提交 读)

  顾名思义就是读出了还没有提交的数据,特点:效率高,但是就是容易出现脏读。最低的事物隔离级别,仅保证不读取物理受损的数据。。事物中修改的行 udpate  delete inset  行,select的时候要不会获取该行的共享锁(UNCOMMITED),所有select不要等待。

--开始事物
BEGIN TRANSACTION
--查询第一次,获取共享锁,查询完之后马上释放共享锁
SELECT * FROM UserTable AS ut
--插入数据,获取 修改数据的 排它锁
insert INTO UserTable
(
-- UserID -- this column value is auto-generated
UserName,
NewClo
)VALUES('西伯利亚的狼',)
--等到15秒,让其他用户查询
WAITFOR DELAY '00:00:15'
--第二次查询,会查到西伯利亚的狼
SELECT * FROM UserTable AS ut
--commit時候自动释放排他锁
COMMIT TRANSACTION

新增脚本:添加数据事物

--设置事物级别
SET TRANSACTION ISOLATION LEVEL
READ UNCOMMITTED
SELECT * FROM UserTable AS ut WHERE ut.UserName='西伯利亚的狼'

查询脚本:设置事物级别并查询上面添加进去的数据

--即使上面有拍它所,也可以查出来
SELECT * FROM UserTable AS ut WITH (NOLOCK) WHERE ut.UserName='西伯利亚的狼'

设置锁查询:表明 as 别名 with(nolock),使锁定的数据也能读出来。

  先执行新增脚本,在马上执行查询脚本,由于新增脚本要等待15秒,事物未提交,但是查询脚本还是把未提交事物的数据查询出来了,设置锁查询with (nolock)也可以查询出来。称为脏读。(但是这种读取的效率高,不等待其他锁,就是会出现脏读。很多和钱打交道的行业比较敏感)

READ COMMIT(提交 读)

  顾名思义就是提交的数据才能读出来。事物中修改的行 udpate  delete inset  行,select的时候要获取该行的共享锁,但是排它锁已经占有,所有select要等待。

--开始事物
BEGIN TRANSACTION
--查询第一次,获取共享锁,查询完之后马上释放共享锁
SELECT * FROM UserTable AS ut
--插入数据,获取 修改数据的 排它锁
insert INTO UserTable
(
-- UserID -- this column value is auto-generated
UserName,
NewClo
)VALUES('西伯利亚的狼',)
--等到15秒,让其他用户查询
WAITFOR DELAY '00:00:15'
--第二次查询,会查到西伯利亚的狼
SELECT * FROM UserTable AS ut
--commit時候自动释放排他锁
COMMIT TRANSACTION

新增脚本:添加数据事物

--设置事物级别
SET TRANSACTION ISOLATION LEVEL
READ COMMITTED
SELECT * FROM UserTable AS ut WHERE ut.UserName='西伯利亚的狼'

查询脚本:设置事物级别并查询上面添加进去的数据

  先执行新增脚本,在马上执行查询脚本,由于新增脚本要等待15秒,事物未提交,查询脚本不能把新加的数据读出来,只能等事物提交完毕,才能读来。默认事物级别

REPEATTABLE READ(重复 读)

   select语句读取出来的数据在整个语句执行过程中不会被更改。同一个事物中,两个相同的SQL语句独处内容不同,出现幻读。目的保持同一个事物中相同的SQL语句读出的内容相同。  update  delete  时候不会痴线幻读,insert出现幻读,      因为select时共享锁持续到事物结束,导致,update delete不能获取拍它锁,

--设置锁级别
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRANSACTION SELECT * FROM Test AS t WHERE t.ID=
--登台15秒 让其他用户修改这一条数据
WAITFOR DELAY '00:00:15' SELECT * FROM Test AS t WHERE t.ID= COMMIT TRANSACTION

查询脚本:设置了重复读级别,查询的共享锁只有在事物结束时才被释放,导致其他修改操作不能获取排它锁。

UPDATE Test
SET
-- ID -- this column value is auto-generated
Name = NEWID() WHERE ID=

修改脚本:修改正在被查询的数据,由于不能获取到排它锁,所以等待

  先执行查询脚本,在马上执行修改脚本,查询脚本等待15秒,共享锁没有释放,所以导致修改脚本也在等待。

 SERIALIZABLE   可串行读

最高的事物隔离级别,使事物之间完全隔离,串行执行。将共享锁保持到事物完成。事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。

SQL-锁-事物级别的更多相关文章

  1. SQL 事务隔离级别

    转载来源:https://www.cnblogs.com/chenmh/p/3998614.html 标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设置数据库事务 ...

  2. 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  3. 【概念原理】四种SQL事务隔离级别和事务ACID特性

    摘要: SQL事务隔离级别和事务的ACID特性 事务是一组读写操作,并且具有只有所有操作都成功才算成功的特性.   事务隔离级别 SQL事务隔离级别由弱到强分别是:READ_UNCOMMITTED.R ...

  4. 04 关于oracle的锁的级别以及介绍

    关于oracle的锁的级别以及介绍 oracle造成锁表的情况: 一.查看锁的对象视图:select object_id,session_id,locked_mode from v$locked_ob ...

  5. (4.12)全面解析-SQL事务+隔离级别+阻塞+死锁

    30分钟全面解析-SQL事务+隔离级别+阻塞+死锁 转自:https://blog.csdn.net/slowlifes/article/details/52752735 2016年10月07日 23 ...

  6. (分享别人的一篇好文章,来自jackson0714)30分钟全面解析-SQL事务+隔离级别+阻塞+死锁()

    30分钟全面解析-SQL事务+隔离级别+阻塞+死锁 阅读目录 概述: 一.事务 二.锁 三.阻塞 四.隔离级别 五.死锁 以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQ ...

  7. Sql Server隔离级别(2)

    Sql Server2005之后,引入了一个新的隔离级别Snapshot(Read Committed Snapshot Isolation (RCSI))和(Snapshot Isolation ( ...

  8. 图解 sql 事务隔离级别

    sql 事务隔离级别有四种分种为: 一 Read Uncpommitted(未提交读) 二 Read Committed(提交读) 三 Repeated Read(可重复读) 四 Serializab ...

  9. 【MySQL】MySQL悲观锁 + 事物 + for update 解决普通流量并发的问题

    使用mysql悲观锁解决并发问题   最近学习了一下数据库的悲观锁和乐观锁,根据自己的理解和网上参考资料总结如下: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事 ...

  10. DVWA sql注入low级别

    DVWA sql注入low级别 sql注入分类 数字型注入 SELECT first_name, last_name FROM users WHERE user_id = $id 字符型注入 SELE ...

随机推荐

  1. P2401 不等数列

    题目描述 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”.问在所有排列中,有多少个排列恰好有k个“<”.答案对2015取模. 注:1~n的排列指的是1 ...

  2. CF757F Team Rocket Rises Again——最短路+支配树

    CF757F Team Rocket Rises Again 全体起立,全体起立,这是我A的第一道黑题(虽然是CF的): 来一波番茄攻击: 不扯淡了,这道题也是学习支配树(之前)应该做的题: 和灾难不 ...

  3. Jedis API操作redis数据库

    1.配置文件 classpath路径下,新建redis.properties配置文件 配置文件内容 # Redis settings redis.host=127.0.0.1 redis.port=6 ...

  4. 分布式锁 ----zookeeper实践 (排它锁)

    排它锁概念: Exclusive Locks,被称为X锁,写锁,独占锁.如果事物T1对数据对象O1加上了排它锁,那么在整个加锁期间,只允许事务T1对O1进行读写操作,其他事务必须等到T1释放锁后才能进 ...

  5. Android自定义view绘图

    一.新建一个视图类,继承自View,重写OnDraw()函数,在函数内绘图 public class myView extends View {//新建一个视图类,继承自View myView(Con ...

  6. map判断

    返回的map对象在!=null的时候有两种情况,一种是没有数据 返回的是{},另外一种是有数据. 判断的时候map!=null&&!map.isEmpty()      

  7. Fiddler自动响应AutoResponder正则匹配

    AutoResponder-Add-Rule Editor 两个文本框,先说第一个: Mathes: 前缀为“EXACT:”表示完全匹配(大小写敏感) 无前缀表示基本搜索,表示搜索到字符串就匹配 前缀 ...

  8. php7的扩展库安装方法

    转:https://www.cnblogs.com/to-be-rich/p/8001175.html 今天的知识点:1.php的再次编译不会对现有的php业务有影响,只有正式kill -USR2 p ...

  9. OpenJudge计算概论-大象喝水

    /*========================================================= 大象喝水 总时间限制: 1000ms 内存限制: 65536kB 描述 一只大象 ...

  10. Flume-Hbase-Sink针对不同版本flume与HBase的适配研究与经验总结

    https://cloud.tencent.com/developer/article/1025430 Flume-Hbase-Sink针对不同版本flume与HBase的适配研究与经验总结 mike ...