sql server 2008学习12 事务和锁

事务

事务的点:

1.begin tran

是事务开始的地方,也是 事务回滚的起点.也就说他会忽略这个起点之后的最终没有提交的所有语句,

2.commit tran

事务的提交 是一个事务的终点

当发出 commit tran命令时,可以认为 该事务是 持久的.

撤销已完成事务的唯一方法 是 发出一个新的事务.从功能上而言,该事务 是对第一个事务的反转.

3.rollback tran

事务回滚到 begin执行之前的状态. 不过也有例外,也可以 使用  保存点.

4.save tran

保存事务从本质上说就是创建书签. 为书签起个名字,就是在回滚中 引用它.

创建书签的好处就是  可以 回滚到代码中的特定位置.

注意: rollback之后会清楚所有的保存点..

事务全部是关于原子性的.

sql server 的日志工作方式:

在数据库的正常操作中,大多数执行的活动都是 “记录”在 事务日志上,而非直接写入数据库中.

检查点 是指 强制把数据库现在所使用的脏页 写入磁盘的周期性操作

脏页 一些在读入到缓存后 已经被修改,但是所进行的修改还没有写入到磁盘的日志或数据页.

写入日志的过程

image

 

锁和并发:

SQL Server锁类型(SQL)收藏
1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁。
2. NOLOCK:不添加共享锁和排它锁,当这个选项生效后,可能读到未提交读的数据或“脏数据”,这个选项仅仅应用于SELECT语句。
3. PAGLOCK:指定添加页锁(否则通常可能添加表锁)。
4. READCOMMITTED用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL Server 2000 在此隔离级别上操作。。
5. READPAST: 跳过已经加锁的数据行,这个选项将使事务读取数据时跳过那些已经被其他事务锁定的数据行,而不是阻塞直到其他事务释放锁,READPAST仅仅应用于READ COMMITTED隔离性级别下事务操作中的SELECT语句操作。
6. READUNCOMMITTED:等同于NOLOCK。
7. REPEATABLEREAD:设置事务为可重复读隔离性级别。
8. ROWLOCK:使用行级锁,而不使用粒度更粗的页级锁和表级锁。
9. SERIALIZABLE:用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于 HOLDLOCK。
10. TABLOCK:指定使用表级锁,而不是使用行级或页面级的锁,SQL Server在该语句执行完后释放这个锁,而如果同时指定了HOLDLOCK,该锁一直保持到这个事务结束。
11. TABLOCKX:指定在表上使用排它锁,这个锁可以阻止其他事务读或更新这个表的数据,直到这个语句或整个事务结束。
12. UPDLOCK :指定在读表中数据时设置更新 锁(update lock)而不是设置共享锁,该锁一直保持到这个语句或整个事务结束,使用UPDLOCK的作用是允许用户先读取数据(而且不阻塞其他用户读数据),并且保证在后来再更新数据时,这一段时间内这些数据没有被其他用户修改。

锁  是 一种防止在某对象执行动作的一个进程 于已在该对象上执行的其他进程 相冲突的机制.

通过锁可以防止的问题:

  • 脏读
  • 非重复性读取
  • 幻读
  • 丢失更新

 

1.脏读

如果一个事务读取的记录 是另一个未完成事务的一部分,那么这时 就发生了脏读.

如果第一个事务正常完成,那么就没问题.如果回滚的话,那将从数据库看来从未发生的事务中获取信息.

2.非重复性读取

如果一个事务中两次读取记录,而另一个事务在这期间改变了数据,就会发生 非重复性读取.

3.幻读

就update数据的同时有人执行insert语句.

4.丢失更新

同时又两个事务,都在更新一条数据,

其中一个更新数据完毕退出了.这是 另一个事务才开始更新此条数据,那么就导致 第一个事务做的更新 丢失了.

 

可以锁定的资源:

  • 数据库
  • 表,锁定整个表,包括 实际的数据行,以及与表相关联的所有索引中的键.
  • 区段
  • 页: 该页上的数据或索引键
  • 键:在索引中的特定键或一系列的键. 相同索引页的其他键不受影响.
  • 行或RID

 

锁定模式

  1. 共享锁: 这是最基本的一种锁.可以防止用户执行脏读.
  2. 排他锁:不与其他任何锁兼容, 这可以防止两个人同时 更新,删除 或执行任何操作.
  3. 更新锁:是一种特殊的占位符.  考虑一下: 为了执行 update,需要验证where子句来指出想要更新的具体行,这需要一个共享锁,

            ,直到真正进行物理更新的时候,需要一个排它锁.

    这说明,更新操作 有一下两个不同的阶段:

    1)指出满足where子句条件的内容,该查询有个 共享锁

     2)决定执行更新,那么锁 升级为 排它锁..否则,将锁转换为 共享锁.

  如果没有更新锁,死锁就会一直出现.两个更新查询会在 共享模式下运行.

a完成了它的查询工作,并准备进行物理更新.它想升级为排它锁.他是不可以这么做,因为b正在完成查询.除非b需要进行物理更新,否则它会完成查询. 为了做到这点,b必须升级为排它锁,但是不能这么做,因为a正在等待.

    4.意向锁

    是真正的占位符,它用来处理对象层次问题.

假设一下,已对某一行建立了锁,但是有人想在页上或区上 建立锁,那么您肯定不愿意.

如果没有意向锁,那么较高层次的对象将不会知道较低层次上有锁.意向锁可改进性能,因为sql server 只需要在表层上检查意向锁,以此来决定事务 是否可以 安全地 锁定整个表.

意向锁分为以下三种类型:

  1. 意向共享锁:该意向锁指  已经或者将要在层次结构的一些较低点处建立共享锁.
  2. 意向排他锁:
  3. 共享意向排它锁:它指已经或将会在 对象层次结构下面建立共享锁,但目的是为了修改数据.会在某个时刻称为排它锁.

  

5.模式锁

分为以下两种:

  1. 模式修改锁(Sch-M): 对对象进行模式改变, 在 模式修改锁 之间,不能对 对象进行查询或其他操作.
  2. 模式稳定性锁定(Sch-S):与共享锁类似, 这个锁唯一目的就是 防止Sch-M.

  6.批量更新锁(BU)

允许并行加载数据.

 

设置隔离级别:

使用 set transaction isolation level 级别

1.read committed

通过 read committed , 任何创建的共享锁 将在创建它们的语句完成后 自动释放.

 

2.read uncommitted

是所有隔离级别选择中最危险的.但是他在速度方面有最好的性能.

设置 该级别,将告诉sql server 不要设置任何锁,也不要实现任何锁.

3.pepeatable read

会稍微地 将隔离级别升级,并提供一个额外的并发保护层.不仅能防止脏读,而且可以防止非重复性读取.

4.serializable

该锁 是堡垒级 的隔离级别. 除了丢失更新意外,它防止所有形式的并发问题.甚至能防止幻读.

4.snapshot

是最新的一种隔离级别. 只有为 数据库打开 allow_snapshot_isolation ,  该级别才可用.

转载于:https://www.cnblogs.com/Mr-Joe/archive/2012/05/10/2494627.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

领导者的资质——学习笔记(3):领导者的十项职责

领导者的资质——学习笔记(3):领导者的十项职责领导者必须向员工说明工作的目的意义,设定具体目标,制定相应的计划,怀着强烈的愿望,付出不亚于任何人的努力,表现出坚强的意志&#x…

漫画:什么是时间复杂度?

时间复杂度的意义 究竟什么是时间复杂度呢?让我们来想象一个场景:某一天,小灰和大黄同时加入了一个公司...... 一天过后,小灰和大黄各自交付了代码,两端代码实现的功能都差不多。大黄的代码运行一次要花100毫秒&#x…

Eclipse如何连接SQL Server 2005数据库

做管理系统当然少不了经常与数据库打交道,在网上搜了很多数据库版本都不小,大的有好几个G的,小的也有几百兆的,我这可怜的内存,最终找了个精简版中的精简版的Sql server2005,只有80几兆,本来只想…

NLP 最新进展

参考文献: •http://www.dataguru.cn/article-14237-1.html •https://zhuanlan.zhihu.com/p/46652512 •https://github.com/google-research/bert •https://allennlp.org/elmo •https://arxiv.org/pdf/1802.05365 •https://arxiv.org/abs/1810.04805

一句话评论设计模式六大原则

注:转自http://blog.csdn.net/jesse621/article/details/7216331 原则,故名思议则是本质的意思。所谓擒贼先擒王,研究设计模式自然要先了解设计原则,所有的模式都是在这些原则的基础之上发展起来的,有的是侧重一 个&am…

Big GAN

参考文献: •https://github.com/kayamin/DR-GAN •https://www.jianshu.com/p/4ee8f9284b81 •http://cvlab.cse.msu.edu/pdfs/Tran_Yin_Liu_CVPR2017.pdf •https://arxiv.org/abs/1809.11096 •https://juejin.im/entry/5c05e76c51882539c60cf2d5 •https:…

时间复杂度空间复杂度怎么算?

什么是算法 算法的定义是这样的:解题方案的准确而完善的描述,是一系列解决问题的清晰指令。巴拉巴拉的,虽然是一小句但还是不想看(题外话:有时候吧专业名词记下来面试的时候还是挺有用的),其实…

什么样的知识,值得我们终生学习

#什么样的知识,值得我们终生学习? 原文:https://dwz.cn/vylyXXJi 一、引言 可能你从初中就开始抱怨:我学相似三角形能干什么?阿伏伽德罗常数有什么用?我一不跳楼,二不高空抛物,学自由…

美团面试题:Hashmap的结构,1.7和1.8有哪些区别,深入的分析

(一) 真实面试题之:Hashmap的结构,1.7和1.8有哪些区别 不同点: (1)JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法,那么他们为什么要这样做呢?因为JDK1…

作品展结束了,学习才真正的开始

我的作品展旅程分为两个大的部分。 一、班里的事务(这是最重要,也最为艰巨的。) 从4月15号自考结束后,开始真正进入作品展的筹划阶段。主要和唐欢负责作品的筛选工作,由于我工作经验有限,能力更是有限&…

数据结构第一章概论习题及答案

一、名词解释 1.数据表示 2.数据处理 3.数据 4.数据元素 5.逻辑关系 6.逻辑结构 7.结构 8.运算 9.基本运算 10.存储结构 11.顺序存储结构 12.链式存储结构 13.索引存储结构 14.散列存储结构 15.算法 16.运行终止的程序可执行部分 17.…

管理学习笔记(1)——高效团队的五大关键

高效团队的五大关键1. 安全感:敢于冒险,不会因此干到不安 2. 可靠性:指望他人可以准时完成高质量的工作 3. 结构与清晰度:目标、角色和执行计划都很清楚、明确 4. 工作意义:对各自来说做意义重大的工作 5. 工作影响…

算法导论-用于不相交集合的数据结构

21.2-4 对于图21-3中操作序列的运行时间,给出其紧确的渐近界。假定采用的是链表表示和加权合并启发式策略。 解:make-set,O(n);加权合并启发,每次将较短链表链接到较长链表,即每次将长度为1的集合链接到另外…

大数据技术之 Kafka (第 3 章 Kafka 架构深入 ) Kafka 消费者

3.3.1 消费方式 consumer 采用 pull(拉)模式从 broker 中读取数据。 push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由 broker 决定的。 它的目标是尽可能以最快速度传递消息,但是这样很…

最活跃FPGA论坛推荐社区

http://forums.xilinx.com/ Xilinx User Community Forums(Xilinx用户交流社区)http://www.openhw.org/ 中国首个开放源码硬件社区http://xilinx.eetrend.com/ 电子创新网赛灵思中文社区http://bbs.elecfans.com/forum.php 电子发烧友社区(电子技术论坛)…

大数据技术之kafka (第 3 章 Kafka 架构深入 ) offset讲解

新版的 Kafka 使用一个选举出来的 controller 来监听 zookeeper,其他 node 再去和 controller 通信,这么做的目的是为了减少 zookeeper 的压力。bootstrap-servers 会自动发现其他 broker,这也是 bootstrap 的含义 前面我们讲到了消费者&…

创建线程的三种方式

第一种,用Thread子类创建 Thread thread new Thread(){ Overridepublic void run() {while(true){try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("1---->" Thread.currentThread().getName())…

大数据技术之kafka (第 3 章 Kafka 架构深入 ) 消费者组案例

1)需求:测试同一个消费者组中的消费者,同一时刻只能有一个消费者消费。 2)案例实操 (1)在 backupo01、backupo02 上修改/usr/local/hadoop/kafka/kafka_2.12-2.4.1/config/consumer.properties 配置 文件…

Easyui弹出窗口在iframe中弹出被当前iframe遮罩的问题(解决方法)

例如我们点击一个按钮&#xff0c;然后弹出我们需要的Window控件窗口。 1 //点击按钮2 var _testWindow window.top.$(testWindow);3 $(#testButton).click(function(){4 if(_testWindow.length < 0) {5 _testWindow window.top.$("<div idtestWin…

JDK1.8中String类的intern()方法学习

jdk1.8字符串常量池是位于堆中&#xff1b; 在jdk1.8中使用如下指令时会同时在堆中和常量池&#xff08;前提是常量池中还没有该对象&#xff09;中创建字符串对象&#xff0c;但是s是指向堆中。 String s new String("HELLO"); 如下方法会判断常量池中是否存在s,…