一、锁

  锁是一种安全机制,控制并发操作,防止用户读取其他用户正在更改的数据,或者多用户同时修改一个数据,从而保证事物的完整性和数据库的一致性。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. 爬虫(十六):scrapy爬取知乎用户信息

    一:爬取思路 首先我们应该找到一个账号,这个账号被关注的人和关注的人都相对比较多的,就是下图中金字塔顶端的人,然后通过爬取这个账号的信息后,再爬取他关注的人和被关注的人的账号信息,然后爬取被关注人的账 ...

  2. AdvanceEast源码理解

    目录 文章思路 源码理解 一. 标签点形式 按顺序排列四个点,逆时针旋转,且第一个点为左上角点(刚开始选择最左边的点, 二. 标签切边 三. loss计算 四. NMS 最后说明 文章思路 大神的gi ...

  3. ROS文件系统级

    ROS的安装就不介绍了,官方教程是最好的:点击打开链接 ROS是机器人操作系统,它应该有自己的工程结构,Linux系统的文件系统如下: 而ROS的文件系统级如下: 接下来逐一介绍它们: 1. catk ...

  4. Spring-Cloud-Eureka实例

    SpringCloud实现服务注册中心 注册中心这么关键的服务,如果是单点话,遇到故障就是毁灭性的.在一个分布式系统中,服务注册中心是最重要的基础部分,理应随时处于可以提供服务的状态.为了维持其可用性 ...

  5. Ubuntu系统下安装完成tomcat进入管理页面

    首先先启动tomcat cd /usr/local/tomcat8. ./bin/startup.sh 然后再打开浏览器 在地址栏中输入 http:/localhost:

  6. Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2)

    A - Forgetting Things 题意:给 \(a,b\) 两个数字的开头数字(1~9),求使得等式 \(a=b-1\) 成立的一组 \(a,b\) ,无解输出-1. 题解:很显然只有 \( ...

  7. TS声明文件

    now我们来看一看TS怎么声明文件, 在JS里面我们经常会使用各种第三方类库,引入方式也不太相同,常见的就是在HTML中通过script标签引入,然后就可以使用全局变量$或者jQuery了 我们通常这 ...

  8. rethinkDB python入门

    Start the server For a more detailed look, make sure to read the quickstart. $ rethinkdb Import the ...

  9. 火焰图工具 SystemTap

    1. 安装 SystemTap 1. 首先安装内核开发包和调试包: # rpm -ivh kernel-debuginfo-common-($version).rpm # rpm -ivh kerne ...

  10. java Calendar 小时值得到24进制格式

    Calendar cal = Calendar.getInstance(); cal.get(Calendar.HOUR_OF_DAY)