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:事务锁下的并发处理(十五)的更多相关文章

  1. SQL注入之Sqli-labs系列第二十五关(过滤 OR & AND)和第二十五A关(过滤逻辑运算符注释符)

    开始挑战第二十五关(Trick with OR & AND) 第二十五关A(Trick with comments) 0x1先查看源码 (1)这里的or和and采用了i正则匹配,大小写都无法绕 ...

  2. SQL注入之Sqli-labs系列第十五关和第十六关(基于POST的时间盲注)

    开始挑战第十五关(Blind- Boolian Based- String)和 第十六关(Blind- Time Based- Double quotes- String) 访问地址,输入报错语句 ' ...

  3. FreeSql (三十五)CodeFirst 自定义特性

    比如项目内已经使用了其它 orm,如 efcore,这样意味着实体中可能存在 [Key],但它与 FreeSql [Column(IsPrimary = true] 不同. Q: FreeSql 实体 ...

  4. FreeSql (十五)查询数据

    FreeSql在查询数据下足了功能,链式查询语法.多表查询.表达式函数支持得非常到位. IFreeSql fsql = new FreeSql.FreeSqlBuilder() .UseConnect ...

  5. FreeSql (二十五)延时加载

    FreeSql 支持导航属性延时加载,即当我们需要用到的时候才进行加载(读取),支持1对1.多对1.1对多.多对多关系的导航属性. 当我们希望浏览某条订单信息的时候,才显示其对应的订单详细记录时,我们 ...

  6. sql server 锁与事务拨云见日(下)

    在锁与事务系列里已经写完了上篇中篇,这次写完下篇.这个系列俺自认为是有条不紊的进行,但感觉锁与事务还是有多很细节没有讲到,温故而知新可以为师矣,也算是一次自我提高总结吧,也谢谢大伙的支持.在上一篇的末 ...

  7. [翻译]:SQL死锁-锁与事务级别

    其实这一篇呢与解决我项目中遇到的问题也是必不可少的.上一篇讲到了各种锁之间的兼容性,里面有一项就是共享锁会引起死锁,如何避免呢,将我们的查询都设置中read uncommitted是否可行呢?其结果显 ...

  8. sql server 锁与事务拨云见日(中)

    一.事务的概述 上一章节里,重点讲到了锁,以及锁与事务的关系.离上篇发布时间好几天了,每天利用一点空闲时间还真是要坚持.听<明朝那些事儿>中讲到"人与人最小的差距是聪明,人与人最 ...

  9. sql server 锁与事务拨云见日(上)

    一.概述 讲到sql server锁管理时,感觉它是一个大话题,因为它不但重要而且涉及的知识点很多,重点在于要掌握高并发要先要掌握锁与事务,涉及的知识点多它包括各式各样的锁,锁的组合,锁的排斥,锁延伸 ...

随机推荐

  1. ABP框架系列之十一:(AspNet-Core-ASPNET核心)

    Introduction This document describes ASP.NET Core integration for ASP.NET Boilerplate framework. ASP ...

  2. qhfl-1 跨域

    CORS跨域请求 CORS即Cross Origin Resource Sharing 跨域资源共享,那么跨域请求还分为两种,一种叫简单请求,一种是复杂请求 简单请求 HTTP方法是下列方法之一 HE ...

  3. 配置 npm 缓存目录,防止占满系统版

    通过命令编辑缓存的路径配置: npm config edit 内如如: 指定到系统盘之外的路径,如 d: 盘:然后将原来目录中已缓存的内如剪切过来~ Notice(2019.3.15): 截图中路径含 ...

  4. 【jenkins 忘记密码】忘记Jenkins管理员密码的解决办法

    一.admin密码未更改情况 1.进入\Jenkins\secrets目录,打开initialAdminPassword文件,复制密码: 2.访问Jenkins页面,输入管理员admin,及刚才的密码 ...

  5. poj 2505 A multiplication game

    题目 题意:两个人轮流玩游戏,Stan先手,数字 p从1开始,Stan乘以一个2-9的数,然后Ollie再乘以一个2-9的数,直到谁先将p乘到p>=n时那个人就赢了,而且轮到某人时,某人必须乘以 ...

  6. 3 week work—Grid Layout

    HTML: <div class="wrapper"> //建立一个三列轨道网格. <div class="one">One</d ...

  7. uniGUI经验几则

    uniGUI经验几则 (2015-11-07 21:42:41) 转载▼ 标签: it 分类: uniGUI 1.uniTimer的妙用 很多时候,都会遇到在一个uniForm或者uniFrame加载 ...

  8. 关于ASP.NET MVC 中JsonResult返回的日期值问题

    最近开始用MVC做项目,在使用 JsonResult返回数据的时候,日期被反射成了/Date 1233455这种格式,遍查网上都是在客户端使用JS来处理这个问题的,这样的话,就需要在每一个涉及到日期的 ...

  9. Apache Drill - join HBase and RDBMs

    HBase作为Nosql的常用系统之一,在很多大数据应用/平台中广泛使用.例如通过Spark统计后将结果存放到HBase中.通常统计结果还需要进一步和元数据或者字典表关联从而得到最终结果显示,这意味着 ...

  10. 技术文档生成工具:appledoc

    做项目一般都会要求写技术文档,特别是提供SDK或者基础组件的.如果手写这类技术文档的话,工作量比编写代码也少不了多少.比如 Java 语言本身就自带 javadoc 命令,可以从源码中抽取文档.本篇我 ...