原文: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. P5662 纪念品

    P5662 纪念品 题解 拿到题目想到DP,但是就是不知道咋写 后来证实这是个背包DP(最近整理背包白整了 我们观察这道题目的特殊之处: 也就是说,对于手中的物品,我们可以今天买了然后明天早上接着卖出 ...

  2. python 简化数据结构的初始化一

    写在前面 在it行业混了差不多十年了,懊悔自己开始写博客的时间太晚.有那么一天就开始写了,也不知道自己会不会坚持写下去.不知不觉日子过到了今天,回头看看,也算是坚持写了.现在写博客的感觉好奇怪,一天天 ...

  3. PHP网络服务

    [Socket] socket_create 用于创建一个Socket socket_bind 用于将IP地址和端口绑定到socket_create 函数所创建的句柄中. socket_listen ...

  4. Qt编写控件属性设计器5-属性中文

    一.前言 在上一篇文章中就提到过,使用qtpropertybrowser来加载属性,对应加载到的属性是英文的,也就是控件类中Q_PROPERTY描述的变量名称,如何变成中文或者其他语言显示呢?这个就需 ...

  5. spark简单文件配置

    cd /usr/local/spark/spark-2.2.1-bin-hadoop2.7/conf cp slaves.template slaves cp spark-env.sh.templat ...

  6. react 生命周期函数的一些心得体会

    一.理论 组件本质上是状态机,输入确定,输出一定确定 生命周期的三个阶段,三者时间是不固定的,只是在逻辑上的分类: 二.初始化阶段: getDefaultProps:获取实例的默认属性(即使没有生成实 ...

  7. Jrebel激活方法

    参考 https://www.yanjiayu.cn/posts/3eecb801.html https://gitee.com/gsls200808/JrebelLicenseServerforJa ...

  8. 【c# 学习笔记】数值类型

    c# 中的数值类型分为:整型.浮点型.十进制.如下图. 1.整型数值的取值范围和内存大小 类型 说明 取值范围 byte 无符号的8位整数 0到255(即2的8次方-1) sbyte   有符号的8位 ...

  9. linux系统中RAID10磁盘冗余阵列配置

    介绍:RAID10:需要至少四块(含)硬盘,兼具速度和安全性,但成本很高,RAID10用两个磁盘做RAID0,用其他两个做RAID1当备份. 配置流程: 第一步:在原有基础上为磁盘再填入五块磁盘(至少 ...

  10. linux 环境下jmeter+ant+jenkins

    一.linux下的jenkins的安装: 下载链接:https://pan.baidu.com/s/1qZItZOC 密码:58da Jenkins 下载网址: http://jenkins-ci.o ...