T-SQL:事务锁下的并发处理(十五)
1.事务
在sql servce 中 事务是一个工作单元 可能包含查询和修改数据以及修改数据定义等多个活动 也可以显示或隐式定义事务边界
显示定义事务 BEGIN TRAN 开始 如果要提交事务 使用 COMMIT TRAN 撤销事务(回滚) ROLLBACK TRAN 如下示例
BEGIN TRAN; INSERT INTO Sales.Orders (custid, empid, orderdate, requireddate, shippeddate, shipperid, freight, shipname, shipaddress, shipcity, shippostalcode, shipcountry) VALUES (, , ', , 32.38, N'Ship to 85-B', N'6789 rue de l''Abbaye', N'Reims', N', N'France'); commit tran
一个简单的显示事务 也可以是隐式事务
GO INSERT INTO Sales.Orders (custid, empid, orderdate, requireddate, shippeddate, shipperid, freight, shipname, shipaddress, shipcity, shippostalcode, shipcountry) VALUES (, , ', , 32.38, N'Ship to 85-B', N'6789 rue de l''Abbaye', N'Reims', N', N'France'); GO
通过GO 在当前批执行完成时自动 提交事务 当然默认情况下SQL Server 将每个单独的语句作为一个事务 每个语句结束后SQL Server 会自动提交事务 也可通过设置会话来改变默认设置
SET IMPLICIT_TRANSACTIONS ON
设置为ON 后不需要指定BEGIN TRAN 语句开始事务 但必须以COMMIT TRAN或 TOLLBACK TRAN 标记结束
事务有4个属性-原子性,一致性,隔离性,持续性 首字母缩写为ACID
原子性(Atomicity): 事务是一个原子工作单元,事务中的所有修改要么提交,要么撤销。在事务提交指令记录到事务日志之前 如果系统出现了故障,重新启动时,SQL Server 会撤销所做的修改。 如果事务中出现错误 默认会自动回滚 也可以通过 @@TRANCOUNT 检测事务事务完成 或者说是 当前环境是否在事务中 如果在就返回 1 没有就是0
SELECT @@TRANCOUNT
一致性(Consistency):指数据状态, 在隔离级别中 每个级别都要是 一致性级别 只有事务保持一致性级别才能访问。在约束中 也指 主外键 书屋会转换数据库的一致性状态到另一个一致性状态 保持一致性
隔离性(Isolation):隔离是一种控制访问数据的机制,确保事务所范围数据是在其所期望的一致性级别中的数据。在SQL Server 中支持两种不同的模式来处理隔离:基于锁的传统模式和行版本控制(新模式) 但是默认的是 锁模式 而且当前加锁也是共享锁 ,如果数据状态不一致 读取数据就会被阻止 直到状态一致 。而改成行版本控制模式 读取就不需要等待 也不会加共享锁 在不需要及时显示的数据时 这种模式是提高并发的处理方式。 具体实现要看使用的隔离级别。
持续性(Durability):数据修改在写入到数据库磁盘之前,总是先写入数据库的事务日志磁盘。提交后,指令记录在事务日志磁盘上,在尚未修改磁盘数据之前,事务是持续的,回滚也只是删除事务日志的所有修改记录。
下面是一个完整的事务示例:
BEGIN TRAN; DECLARE @neworderid AS INT; BEGIN TRY INSERT INTO Sales.Orders (custid, empid, orderdate, requireddate, shippeddate, shipperid, freight, shipname, shipaddress, shipcity, shippostalcode, shipcountry) VALUES (, , ', , 32.38, N'Ship to 85-B', N'6789 rue de l''Abbaye', N'Reims', N', N'France'); SET @neworderid = SCOPE_IDENTITY(); SELECT @neworderid AS neworderid; INSERT INTO Sales.OrderDetails(orderid, productid, unitprice, qty, discount) , , 0.000), (, , 0.000), (, , 0.000); COMMIT TRAN; END TRY BEGIN CATCH ROLLBACK TRAN; END CATCH
2.锁
锁是事务保护数据资源而获得的控制资源,防止其他事务的冲突或不兼容访问。
锁主要有两种锁模式 排他锁和共享锁
当你试图修改数据时 事务会请求数据资源的一个排他锁,它会一直到事务结束才会解除 期间任何其他事务请求都会被阻塞。对于单条语句事务 只要这条语句结束锁就会自动解除。对于多条语句事务 就只有当他完成所有语句执行并通过 COMMIT TRAN 或 ROLLBACK TRAN 命令时事务才会解除锁
排他锁:如果一个事务在修改行,直到事务完成,其他事务都不能修改相同的行。但是能不能读取相同行 取决于它的隔离级别。
共享锁:在读取事务加锁是默认加的是共享锁 SQL读取的默认隔离级别 READ COMMITTED 因为此隔离级别 会让事务请求读取资源时默认加上共享锁 多个事务可以同时拥有相同数据资源共享锁。 此模式下也会因为并发造成幻读 虽然在修改数据时,无法修改锁和持续时间,但可以通过改变隔离级别 在读取数据时控制锁定的处理方式。
其实锁的本质就是数据的隔离级别 在通过控制隔离级别也能达到加锁的效果 ,而且效果更好。
在SQL 中默认的隔离级别 READ COMMITTED SNAPSHOT 这种隔离依靠行版本控制,而不是锁,在此模式下 读取者不需要共享锁,因为不需要等待,依赖行版本控制技术提供隔离。 如果一个事务在READ COMMITTED隔离级别下 修改数据行 直到事务完成,另一个事务都不能读取相同行。这种并发控制称 “悲观式并发” 如果一个事务在READ COMMITTED SNAPSHOT隔离级别下 修改数据行 此时另一个事务读取相同行 会获得最后一次提交的可用状态。这种并发控制称 “乐观式并发” 在乐观并发中可以很好的解决修改和展示并发问题。
这种事务之间的并发处理已称为 锁兼容性
请求锁模式 | 请求排他锁 | 请求共享锁 |
请求排他锁 | 否 | 否 |
请求共享锁 | 否 | 是 |
交叉的否代表不兼容 请求锁模式会被拒绝 交叉是 表示兼容 请求锁模式会被接收
那么锁都可以锁些什么资源呢?
锁定的资源包括RID ,键,行,页,对象,表,数据库,范围,分配单元,堆,B树。
锁请求流程规则是什么呢?
例如:获取一个行上的排他锁 事务必须首先获取一个行所在页的意向排他锁和一个拥有该页对象的意向排他锁, 同样的 共享锁也是此步骤。
为什么要申请意向锁?
为了在更高级别有效的检测是否有锁不兼容请求,并防止授予这些锁请求,这就是为什么在排他锁请求相同数据行时被阻断的原因。
例如:一个事务持有行上锁,而另一个事务在该行所在的页或者表请求不兼容锁比如排他锁 有第一个事务的行上锁 有一个 表意向锁 这个时候请求就被拒绝了
但意向锁不会拒绝更低级别对象的锁请求
例如: 一个页上的意向锁不会阻断在该页的其他事务的排他锁 我们可以通过一个表来细致的了解这些锁的兼容性请求。
请求锁模式 | 请求排他锁 | 请求共享锁 | 请求意向排他锁 | 请求意向共享锁 |
请求排它锁 | 否 | 否 | 否 | 否 |
请求共享锁 | 否 | 是 | 否 | 是 |
请求意向排他锁 | 否 | 否 | 是 | 是 |
请求意向共享锁 | 否 | 是 | 是 | 是 |
通过这些锁得到我们最理想的并发处理 锁定所需要的内容,即受影响行数 。锁是需要内存资源和内部管理开销, 当需要锁时要考虑当前系统资源情况。
有一个情况不得不说 在行锁中超过5000个时 会自动升级锁 到表锁 然后每加1250个锁都会触发默认的锁升级
可以通过ALTER TABLE语句设置LOCK_ESCALATION 的表选项控制锁升级。 也可以禁用。 也可以更改升级方式 比如 分区级别( 把一个表物理的组织成小单元c成为分区) 锁到此语句结束了下次讲 如何优雅的排除并发导致的阻塞数据处理。
T-SQL:事务锁下的并发处理(十五)的更多相关文章
- SQL注入之Sqli-labs系列第二十五关(过滤 OR & AND)和第二十五A关(过滤逻辑运算符注释符)
开始挑战第二十五关(Trick with OR & AND) 第二十五关A(Trick with comments) 0x1先查看源码 (1)这里的or和and采用了i正则匹配,大小写都无法绕 ...
- SQL注入之Sqli-labs系列第十五关和第十六关(基于POST的时间盲注)
开始挑战第十五关(Blind- Boolian Based- String)和 第十六关(Blind- Time Based- Double quotes- String) 访问地址,输入报错语句 ' ...
- FreeSql (三十五)CodeFirst 自定义特性
比如项目内已经使用了其它 orm,如 efcore,这样意味着实体中可能存在 [Key],但它与 FreeSql [Column(IsPrimary = true] 不同. Q: FreeSql 实体 ...
- FreeSql (十五)查询数据
FreeSql在查询数据下足了功能,链式查询语法.多表查询.表达式函数支持得非常到位. IFreeSql fsql = new FreeSql.FreeSqlBuilder() .UseConnect ...
- FreeSql (二十五)延时加载
FreeSql 支持导航属性延时加载,即当我们需要用到的时候才进行加载(读取),支持1对1.多对1.1对多.多对多关系的导航属性. 当我们希望浏览某条订单信息的时候,才显示其对应的订单详细记录时,我们 ...
- sql server 锁与事务拨云见日(下)
在锁与事务系列里已经写完了上篇中篇,这次写完下篇.这个系列俺自认为是有条不紊的进行,但感觉锁与事务还是有多很细节没有讲到,温故而知新可以为师矣,也算是一次自我提高总结吧,也谢谢大伙的支持.在上一篇的末 ...
- [翻译]:SQL死锁-锁与事务级别
其实这一篇呢与解决我项目中遇到的问题也是必不可少的.上一篇讲到了各种锁之间的兼容性,里面有一项就是共享锁会引起死锁,如何避免呢,将我们的查询都设置中read uncommitted是否可行呢?其结果显 ...
- sql server 锁与事务拨云见日(中)
一.事务的概述 上一章节里,重点讲到了锁,以及锁与事务的关系.离上篇发布时间好几天了,每天利用一点空闲时间还真是要坚持.听<明朝那些事儿>中讲到"人与人最小的差距是聪明,人与人最 ...
- sql server 锁与事务拨云见日(上)
一.概述 讲到sql server锁管理时,感觉它是一个大话题,因为它不但重要而且涉及的知识点很多,重点在于要掌握高并发要先要掌握锁与事务,涉及的知识点多它包括各式各样的锁,锁的组合,锁的排斥,锁延伸 ...
随机推荐
- 部署eclipse项目到tomcat
1.为了以防万一,将本地tomcat版本及其jdk版本与服务器上的版本最好是相同的 2.在本地eclipse下运行项目即可发布(注意(1)数据库连接的是服务器数据库还是本地数据库(2)运行项目前先cl ...
- POI 导出
package com.baoqilai.scp.service; import java.io.File; import java.io.FileOutputStream; import java. ...
- JavaScript基础视频教程总结(041-050章)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 配置微信jssdk自定义分享
前段时间做这个功能的时候遇到这个问题,之前的话是微信自动抓取界面第一张图,现在微信更新api,必须自行配置,接入jssdk,才能实现该功能. 详细可以查看微信的jssdk文档 微信官方开发者文档 ...
- JQuery续
一.表单属性选择器 :enabled :disabled :checked :selected <body> <form> <input type="check ...
- 【repost】H5的新特性及部分API详解
h5新特性总览 移除的元素 纯表现的元素: basefont.big.center.font等 对可用性产生负面影响的元素: frame.frameset.noframes 新增的API 语义: 能够 ...
- Android-Java-构造函数间调用&this内存图
构造函数间调用: 描述Person对象: package android.java.oop08; // 描述Person对象 public class Person { public String n ...
- HashMap的源码分析
hashMap的底层实现是 数组+链表 的数据结构,数组是一个Entry<K,V>[] 的键值对对象数组,在数组的每个索引上存储的是包含Entry的节点对象,每个Entry对象是一个单链表 ...
- java相关技术问答(一)
网上一些没有标准答案的面试题,我自己做的解答总结,有任何异议可以提出来~^_^,不断更新中... Springboot除了自动配置与传统的spring还有哪些不同 传统的springweb项目需要部署 ...
- 机器学习技法笔记:07 Blending and Bagging
Roadmap Motivation of Aggregation Uniform Blending Linear and Any Blending Bagging (Bootstrap Aggreg ...