原文:SQL优化中的重要概念:事务


sql 优化和事务有关系?

从表面上看,让sql跑的更快,似乎和事务这个概念没什么联系,但是关系数据库中最重要的2个概念就是 关系、事务。

关系,对应到sql中,是通过 主外键以及join 来实现的,当然,没有主外键,照样能关联表。

事务,是数据库提供的,特别是在高并发的情况下,保障数据一致的一种机制。

但实际上,当一个会话在修改数据,而另一个会话又要读取数据时,事务就自动发挥作用了。

通常情况下,似乎这个事务又离我们很远,似乎来无影,去无踪的概念,不过我们可以通过一些系统试图,查询到事务的具体信息,加深对事务的理解。

1、隐式事务

隐式事务就是如果不显式的进行 commit或rollback,事务一致存在。

由于默认情况下 sql server是关闭隐式事务的,所以下面在实验中要打开隐式事务。


  1. /*==================================================================
  2. 当以create,drop,
  3. fetch,open,
  4. revoke,grand,
  5. alter table,select,insert,delete,update,truncate table
  6. 语句首先执行的时候,SQL Server会话自动打开一个新的事务,
  7. 如果在会话中激活了隐式事务模式,那么这个事务会一直保持打开状态,
  8. 直到rollback或commit语句这个事务才结束,如果忘记提交事务,
  9. 那么在相应的隔离级别下,事务占用的锁可能不会释放,因此尽量不要用隐式事务。
  10. ====================================================================*/
  11. --会话1
  12. set implicit_transactions on
  13. update t
  14. set v = 'ext12'
  15. set implicit_transactions off
  16. select @@TRANCOUNT --输出:1,说明事务没有释放
  17. --占用的X独占锁不会释放,会阻塞其他会话

  1. --会话2,被会话1阻塞住了,不会返回任何记录
  2. select *
  3. from t

在会话1中执行commit来提交事务,那么会话2马上就会返回记录了。

现在把两个会话的执行顺序调换一下:


  1. --会话1
  2. set implicit_transactions on --打开了隐式事务
  3. select *
  4. from t
  5. set implicit_transactions off
  6. select @@TRANCOUNT --输入:1,说明这个会话中的事务也没有提交

  1. --会话2,会话2没有被会话1阻塞,
  2. --之所以这样是因为会话的默认隔离级别是read committed,
  3. --会话1中的事务虽然没有提交,但是select语句在这种隔离级别下,
  4. --运行完就会释放占用的S共享锁,所以不会阻塞写操作
  5. update t
  6. set v = 'ext'

2、显示数据库最早的活动事务


  1. /*==============================================================
  2. 如果事务在数据库中始终打开,有可能会阻塞其他进程的操作,
  3. 为什么是有可能而不是一定呢,
  4. 原因就是:在默认隔离级别下的select语句查询到数据后就会立即释放共享锁。
  5. 另外,日志备份也只会截断不活动事务的那部分日志,所以活动的事务
  6. 会导致日志数据越来越多。
  7. 为了找到没有提交的事务,可以用下面的命令显示某个数据库最早的活动事务.
  8. 不过有个例外,就是下面的命令不会返回:不占用锁资源的未提交事务
  9. ================================================================*/
  10. begin tran --开始显示事务
  11. select *
  12. from t --运行后立即释放共享锁
  13. select @@TRANCOUNT --输入:1,说明没有提交事务
  14. dbcc opentran('wc') --显示数据库最早的活动事务,
  15. --但是这儿显示"没有处于打开状态的活动事务"

3、通过会话来查询事务信息


  1. --由于上面未提交事务中的select语句在默认的隔离级别下执行后自动释放了共享锁,
  2. --所以dbcc opentran命令并没有返回这个活动事务,
  3. --不过下面的视图解决了这个问题,可以找到所有活动事务。
  4. --找到活动事务
  5. select session_id, --session_id与transaction_id的对应关系
  6. transaction_id,
  7. is_user_transaction,
  8. is_local
  9. from sys.dm_tran_session_transactions --会话中的事务,识别所有打开的事务
  10. where is_user_transaction =1
  11. --找到活动事务对应的执行语句
  12. select c.session_id, --session_id与connection_id的对应关系
  13. c.connection_id,
  14. c.most_recent_sql_handle,
  15. s.text
  16. from sys.dm_exec_connections c --执行连接,最近执行的查询信息
  17. cross apply sys.dm_exec_sql_text(c.most_recent_sql_handle) s
  18. where c.session_id = 361
  19. --活动事务的具体信息
  20. select t.transaction_id,
  21. t.name, --这里显示user_transaction
  22. t.transaction_begin_time,
  23. case t.transaction_type --事务类型
  24. when 1 then '读/写事务'
  25. when 2 then '只读事务'
  26. when 3 then '系统事务'
  27. when 4 then '分布式事务'
  28. end 'transaction type',
  29. case t.transaction_state
  30. when 0 then '事务尚未完全初始化'
  31. when 1 then '事务已初始化但尚未启动'
  32. when 2 then '事务处于活动状态'
  33. when 3 then '事务已结束。该状态用于只读事务'
  34. when 4 then '已对分布式事务启动提交进程'
  35. when 5 then '事务处于准备就绪状态且等待解析'
  36. when 6 then '事务已提交'
  37. when 7 then '事务正在被回滚'
  38. when 8 then '事务已回滚'
  39. end 'transaction state'
  40. from sys.dm_tran_active_transactions t --活动的事务
  41. where transaction_id = 150764485
发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

SQL优化中的重要概念:事务的更多相关文章

  1. SQL优化中的重要概念:锁定

    原文:SQL优化中的重要概念:锁定 上篇文章讲的是事务,这篇就引出另一个重要概念,就是锁定. 当一个用户要读取另一个用户正在修改的数据,或者一个用户正在修改另一个用户正在读取的数据,或者一个用户要修改 ...

  2. SQL优化中的重要概念:阻塞

    原文:SQL优化中的重要概念:阻塞 上一篇讲到锁定的概念,那么接下来就是如何找到由于锁定而发生阻塞的进程,并解决阻塞问题. 1.会话1,修改数据,但没有提交事务 BEGIN TRAN select @ ...

  3. SQL优化中的重要概念:死锁

    原文:SQL优化中的重要概念:死锁 上面几篇文章讲到 事务.锁定.阻塞,最后还有一种比较极端的情况,就是死锁,这也是锁定.阻塞的一种情况. 死锁是当两个事务分别锁定了资源,而又继续请求对方已获取的资源 ...

  4. Sql Server 中锁的概念(1)

    Sql Server 中锁的概念   锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破 ...

  5. 理解SQL Server中索引的概念

    T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他   简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能 ...

  6. SQL Server误区30日谈 第26天 SQL Server中存在真正的“事务嵌套”

    误区 #26: SQL Server中存在真正的“事务嵌套”错误 嵌套事务可不会像其语法表现的那样看起来允许事务嵌套.我真不知道为什么有人会这样写代码,我唯一能够想到的就是某个哥们对SQL Serve ...

  7. Sql Server 中锁的概念

    锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏 ...

  8. 面试被问之-----sql优化中in与exists的区别

    曾经一次去面试,被问及in与exists的区别,记得当时是这么回答的:''in后面接子查询或者(xx,xx,xx,,,),exists后面需要一个true或者false的结果",当然这么说也 ...

  9. SQL Server 中的6种事务隔离级别简单总结

    本文出处:http://www.cnblogs.com/wy123/p/7218316.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

随机推荐

  1. Python JSON 字符串 转 json 基本使用

    字符串 转  json import json jsonData = '{"a":1,"b":2,"c":3,"d":4 ...

  2. yolov1, yolo v2 和yolo v3系列

    目标检测模型主要分为two-stage和one-stage, one-stage的代表主要是yolo系列和ssd.简单记录下学习yolo系列的笔记. 1 yolo V1 yolo v1是2015年的论 ...

  3. android studio: 实现类似于XCode中的#pragma mark的效果

    代码行数写多了,想找一个指定的方法真困难,关键有时候记不住方法的名字,用Ctrl+O也不好使,突然想到以前做iOS开发时,XCode里有一个#pragma mark的功能,很好用:在代码中定义这样一个 ...

  4. es6对象复制合并 Object.assign

    对象的复制 var obj= { a: 1 }; var copy = Object.assign({}, obj); console.log(copy); //{ a: 1 } 对象的合并和封装 v ...

  5. angular 中如何绑定属性

    <!--The content below is only a placeholder and can be replaced.--> <div style="text-a ...

  6. 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_13-SpringSecurityOauth2研究-JWT研究-生成JWT令牌&验证JWT令牌

    生成jwt需要用私钥来签名.在Auth认证服务下创建测试类 创建密钥工厂,构造函数需要的参数 获取私钥 有了私钥就可以生成JWT令牌 使用jwtHelper是spring security里面的类 e ...

  7. iOS中NSTimer的使用

    1.初始化 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelect ...

  8. PAT 甲级 1041 Be Unique (20 分)(简单,一遍过)

    1041 Be Unique (20 分)   Being unique is so important to people on Mars that even their lottery is de ...

  9. 【Leetcode_easy】1089. Duplicate Zeros

    problem 1089. Duplicate Zeros 题意: solution: 其中关于虚拟新数组的下标的计算还是有点迷糊... class Solution { public: void d ...

  10. web-自动化测试流程

    1. 自动化测试流程 (1) 需求分析 (2) 挑选适合做自动化测试的功能 (3) 设计测试用例 (4) 搭建自动化测试环境 [可选] (5) 设计自动化测试项目的架构 [可选] (6) 编写代码 ( ...