SQL优化中的重要概念:事务
sql 优化和事务有关系?
从表面上看,让sql跑的更快,似乎和事务这个概念没什么联系,但是关系数据库中最重要的2个概念就是 关系、事务。
关系,对应到sql中,是通过 主外键以及join 来实现的,当然,没有主外键,照样能关联表。
事务,是数据库提供的,特别是在高并发的情况下,保障数据一致的一种机制。
但实际上,当一个会话在修改数据,而另一个会话又要读取数据时,事务就自动发挥作用了。
通常情况下,似乎这个事务又离我们很远,似乎来无影,去无踪的概念,不过我们可以通过一些系统试图,查询到事务的具体信息,加深对事务的理解。
1、隐式事务
隐式事务就是如果不显式的进行 commit或rollback,事务一致存在。
由于默认情况下 sql server是关闭隐式事务的,所以下面在实验中要打开隐式事务。
-
/*==================================================================
-
当以create,drop,
-
fetch,open,
-
revoke,grand,
-
alter table,select,insert,delete,update,truncate table
-
语句首先执行的时候,SQL Server会话自动打开一个新的事务,
-
如果在会话中激活了隐式事务模式,那么这个事务会一直保持打开状态,
-
直到rollback或commit语句这个事务才结束,如果忘记提交事务,
-
那么在相应的隔离级别下,事务占用的锁可能不会释放,因此尽量不要用隐式事务。
-
====================================================================*/
-
-
--会话1
-
set implicit_transactions on
-
-
update t
-
set v = 'ext12'
-
-
set implicit_transactions off
-
-
select @@TRANCOUNT --输出:1,说明事务没有释放
-
--占用的X独占锁不会释放,会阻塞其他会话
-
--会话2,被会话1阻塞住了,不会返回任何记录
-
select *
-
from t
在会话1中执行commit来提交事务,那么会话2马上就会返回记录了。
现在把两个会话的执行顺序调换一下:
-
--会话1
-
set implicit_transactions on --打开了隐式事务
-
-
select *
-
from t
-
-
set implicit_transactions off
-
-
select @@TRANCOUNT --输入:1,说明这个会话中的事务也没有提交
-
--会话2,会话2没有被会话1阻塞,
-
--之所以这样是因为会话的默认隔离级别是read committed,
-
--会话1中的事务虽然没有提交,但是select语句在这种隔离级别下,
-
--运行完就会释放占用的S共享锁,所以不会阻塞写操作
-
update t
-
set v = 'ext'
2、显示数据库最早的活动事务
-
/*==============================================================
-
如果事务在数据库中始终打开,有可能会阻塞其他进程的操作,
-
为什么是有可能而不是一定呢,
-
原因就是:在默认隔离级别下的select语句查询到数据后就会立即释放共享锁。
-
另外,日志备份也只会截断不活动事务的那部分日志,所以活动的事务
-
会导致日志数据越来越多。
-
-
为了找到没有提交的事务,可以用下面的命令显示某个数据库最早的活动事务.
-
-
不过有个例外,就是下面的命令不会返回:不占用锁资源的未提交事务
-
================================================================*/
-
-
begin tran --开始显示事务
-
-
select *
-
from t --运行后立即释放共享锁
-
-
select @@TRANCOUNT --输入:1,说明没有提交事务
-
-
dbcc opentran('wc') --显示数据库最早的活动事务,
-
--但是这儿显示"没有处于打开状态的活动事务"
3、通过会话来查询事务信息
-
--由于上面未提交事务中的select语句在默认的隔离级别下执行后自动释放了共享锁,
-
--所以dbcc opentran命令并没有返回这个活动事务,
-
--不过下面的视图解决了这个问题,可以找到所有活动事务。
-
-
-
--找到活动事务
-
select session_id, --session_id与transaction_id的对应关系
-
transaction_id,
-
is_user_transaction,
-
is_local
-
from sys.dm_tran_session_transactions --会话中的事务,识别所有打开的事务
-
where is_user_transaction =1
-
-
-
--找到活动事务对应的执行语句
-
select c.session_id, --session_id与connection_id的对应关系
-
c.connection_id,
-
c.most_recent_sql_handle,
-
s.text
-
from sys.dm_exec_connections c --执行连接,最近执行的查询信息
-
cross apply sys.dm_exec_sql_text(c.most_recent_sql_handle) s
-
where c.session_id = 361
-
-
-
--活动事务的具体信息
-
select t.transaction_id,
-
t.name, --这里显示user_transaction
-
t.transaction_begin_time,
-
-
case t.transaction_type --事务类型
-
when 1 then '读/写事务'
-
when 2 then '只读事务'
-
when 3 then '系统事务'
-
when 4 then '分布式事务'
-
end 'transaction type',
-
-
case t.transaction_state
-
when 0 then '事务尚未完全初始化'
-
when 1 then '事务已初始化但尚未启动'
-
when 2 then '事务处于活动状态'
-
when 3 then '事务已结束。该状态用于只读事务'
-
when 4 then '已对分布式事务启动提交进程'
-
when 5 then '事务处于准备就绪状态且等待解析'
-
when 6 then '事务已提交'
-
when 7 then '事务正在被回滚'
-
when 8 then '事务已回滚'
-
end 'transaction state'
-
from sys.dm_tran_active_transactions t --活动的事务
-
where transaction_id = 150764485
SQL优化中的重要概念:事务的更多相关文章
- SQL优化中的重要概念:锁定
原文:SQL优化中的重要概念:锁定 上篇文章讲的是事务,这篇就引出另一个重要概念,就是锁定. 当一个用户要读取另一个用户正在修改的数据,或者一个用户正在修改另一个用户正在读取的数据,或者一个用户要修改 ...
- SQL优化中的重要概念:阻塞
原文:SQL优化中的重要概念:阻塞 上一篇讲到锁定的概念,那么接下来就是如何找到由于锁定而发生阻塞的进程,并解决阻塞问题. 1.会话1,修改数据,但没有提交事务 BEGIN TRAN select @ ...
- SQL优化中的重要概念:死锁
原文:SQL优化中的重要概念:死锁 上面几篇文章讲到 事务.锁定.阻塞,最后还有一种比较极端的情况,就是死锁,这也是锁定.阻塞的一种情况. 死锁是当两个事务分别锁定了资源,而又继续请求对方已获取的资源 ...
- Sql Server 中锁的概念(1)
Sql Server 中锁的概念 锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破 ...
- 理解SQL Server中索引的概念
T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他 简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能 ...
- SQL Server误区30日谈 第26天 SQL Server中存在真正的“事务嵌套”
误区 #26: SQL Server中存在真正的“事务嵌套”错误 嵌套事务可不会像其语法表现的那样看起来允许事务嵌套.我真不知道为什么有人会这样写代码,我唯一能够想到的就是某个哥们对SQL Serve ...
- Sql Server 中锁的概念
锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏 ...
- 面试被问之-----sql优化中in与exists的区别
曾经一次去面试,被问及in与exists的区别,记得当时是这么回答的:''in后面接子查询或者(xx,xx,xx,,,),exists后面需要一个true或者false的结果",当然这么说也 ...
- SQL Server 中的6种事务隔离级别简单总结
本文出处:http://www.cnblogs.com/wy123/p/7218316.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...
随机推荐
- PHPStorm 快捷键大全(Win/Linux/Mac)
下面的-符号记得改成 ‘`’,markdown 语法会转义.使用频率是我自己为准.仅供参考 Mac 符号 符号 解释 ⌘ Command ⇧ Shift ⌃ Control ↩ Enter/Ret ...
- cv相关博客文章
收藏些图像处理,机器学习,深度学习方面比较不错的文章,时常学习,复习和膜拜吧... 图像方面(传统CV): 1. SIFT特征 https://www.cnblogs.com/wangguchangq ...
- Linux Bash Shell j简单入门
BASH 的基本语法 最简单的例子 —— Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1 ...
- 如果你处理的是字节,那么 Go 语言可能是一个不错的选择。 如果你处理的是数据,那么 Go 语言可能不是一个好的选择。
用Go语言编程的利与弊 AI前线小组 译 InfoQ 今天
- 浅谈TextView Ellipsize效果与Marquee跑马灯无效果问题
说到TextView 效果,相信大家一定熟悉跑马灯. 先来看看 Ellipsize是什么,Ellipsize 从开发技术上翻译为省略效果.故名思议,就是当文本无法显示全部时,用什么效果来显示未显示的部 ...
- Json序列化指定输出字段 忽略属性
DataContract 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务 ...
- nginx中获取真实的客户端访问IP
date : 2019-06-28 16:54:50 author: headsen chen notice: 个人原创 1,必需要先搞清楚的基本概念 1.1 什么是remote_addr ...
- 011-多线程-JUC集合-Queue-PriorityBlockingQueue和DelayQueue
一.PriorityBlockingQueue简介 PriorityBlockingQueue是一个支持优先级的无界阻塞队列.默认情况下元素采用自然顺序升序排列.也可以自定义类实现compareTo( ...
- java-selenium 框架例子
package mavenweb2; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.o ...
- (二)Centos之在VM虚拟机中安装Centos操作系统
一.下载 阿里云镜像 https://mirrors.aliyun.com/centos/7/isos/x86_64/ 下载那个 DVD版本即可. 二.安装 在安装操作系统之前 我们来给这个“机器”搞 ...
