事务

事务的点:

1.begin tran

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

2.commit tran

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

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

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

3.rollback tran

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

4.save tran

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

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

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

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

sql server 的日志工作方式:

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

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

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

写入日志的过程

锁和并发:

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 ,  该级别才可用.

sql server 2008学习12 事务和锁相关推荐

  1. sql server 2008 学习笔记

    sql server 2008 删除已有的实例 想从setup.exe中区卸载,没找到. 原来还是要从控制面板中卸载,卸载Microsoft SQL Server 2008 卸载界面会提示让你选择要删 ...

  2. sql server 2008学习1–系统数据库

    master数据库 数据库记录 SQL Server 系统的所有系统级信息.这包括实例范围的元数据(例如登录帐户).端点.链接服务器和系统配置设置.此外,master 数据库还记录了所有其他数据库的存 ...

  3. sql server 2008学习10 存储过程

    输入输出参数: 给存储过程传参数,叫做输入参数,用户告诉存储过程需要 利用这个参数干些什么. 输出参数: 从存储过程得到那些数据. 创建一个可选参数的存储过程: create proc pa1 @na ...

  4. sql server 2008学习9 视图

    创建简单视图: use test go create view v1(视图名) as select name from b 这样视图就创建好了. 下面说下视图的本质: 当执行  select * fr ...

  5. sql server 2008学习8 sql server存储和索引结构

    sql server的存储机制 区段: 是用来为表和索引 分配空间的基本存储单元. 由 8个连续的页面构成,大小为64kb. 区段的注意事项: 一旦区段已满,那么下一记录 将要占据的空间不是记录的大小 ...

  6. sql server 2008学习4 设计索引的建议

    索引设计的建议: 一.检查where子句和连接条件列 当一个查询提交到sql server时,查询优化器尝试为查询中引用的所有表查找最佳的数据访问机制, 一下是它所进行的方式. 1.优化器识别Wher ...

  7. sql server 2008学习5 sql基础

    查看数据库的信息: INFORMATION_SCHEMA.CHECK_CONSTRAINTS INFORMATION_SCHEMA.COLUMN_DOMAIN_USAGE INFORMATION_SC ...

  8. sql server 2008学习3 表组织和索引组织

    表组织 表包含在一个或多个分区中,每个分区在一个堆或一个聚集索引结构包含数据行.堆页或聚集索引页在一个或多个分配单元中进行管理,具体的分配单元数取决于数据行中的列类型. 聚集表.堆和索引 SQL Se ...

  9. sql server 2008学习2 文件和文件组

    数据库文件 每个 SQL Server 数据库至少具有两个操作系统文件:一个数据文件和一个日志文件.数据文件包含数据和对象,例如表.索引.存储过程和视图.日志文件包含恢复数据库中的所有事务所需的信息. ...

最新文章

  1. VirtualBox安装kali linux过程及安装后无法全屏问题解决方法(2)
  2. Linux_VMWare12 Install RHEL7
  3. 学习LOWORD、 HIWORD、LOBYTE、HIBYTE
  4. ASP.NET_读写Cookie
  5. dockfile应用(二)
  6. unity中的update、Lateupdate和FixedUpdate。
  7. 用DirectX Audio和DirectShow播放声音和音乐(3)
  8. yii2基础之modal弹窗的基本使用
  9. Linux基础命令---显示文本grep
  10. 绕过某省某大学校园网的探索(处女作)
  11. 在企业级管理软件领域,国内尚没有“好”产品
  12. 论文伪代码(一)论文伪代码实现(Overleaf在线编辑)
  13. antd select 可搜索值
  14. 【JavaScript】用原生js实现幻灯片效果
  15. android和夜神模拟器哪个好,蓝叠和夜神哪个好用?夜神模拟器和蓝叠安卓模拟器区别对比...
  16. 服务器操找不见系统,服务器提示找不到操作系统
  17. 开源测试平台RunnerGo,测试工程师必备
  18. 2021年中国饮料酒行业现状分析:产量有所下降[图]
  19. C语言三个整蛊程序,很强!!
  20. 871. Minimum Number of Refueling Stops

热门文章

  1. ms查约束具体代码_记 Arthas 实现一次 CPU 排查与代码热更新
  2. 卡尔曼滤波器求速度matlab,卡尔曼滤波器算法浅析及matlab实战
  3. 华睿相机sdk 开发_告别翻转腾挪,读码一步到位丨华睿科技六面读码系统
  4. find_all 返回空 python_python小课堂23 - 正则表达式(一)
  5. CORS 跨域 实现思路及相关解决方案(转:http://www.cnblogs.com/sloong/p/cors.html)
  6. mapreduce的shuffle机制(来自学习笔记)
  7. 05_NoSQL数据库之Redis数据库:Redis的常用命令,键值相关命令和服务器相关命令
  8. Mule3用户手册:Mule ESB 3使用要点
  9. Python对图像的基本操作
  10. 深度学习中的激活函数与梯度消失