以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化。
本系列【T-SQL基础】主要是针对T-SQL基础的总结。
【T-SQL基础】01.单表查询-几道sql查询题
【T-SQL基础】02.联接查询
【T-SQL基础】03.子查询
【T-SQL基础】04.表表达式-上篇
【T-SQL基础】04.表表达式-下篇
【T-SQL基础】05.集合运算
【T-SQL基础】06.透视、逆透视、分组集
【T-SQL基础】07.数据修改
【T-SQL基础】08.事务和并发
【T-SQL基础】09.可编程对象
----------------------------------------------------------
【T-SQL性能调优】01.索引优化
【T-SQL性能调优】02.执行计划
【T-SQL性能调优】03.死锁分析
概述:本篇主要是对SQL中事务和并发的详细讲解。
一、事务 1.什么是事务为单个工作单元而执行的一系列操作。如查询、修改数据、修改数据定义。
2.语法(1)显示定义事务的开始、提交
BEGIN TRAN INSERT INTO b(t1) VALUES(1) INSERT INTO b(t1) VALUES(2) COMMIT TRAN
(2)隐式定义
如果不显示定义事务的边界,则SQL Server会默认把每个单独的语句作为一个事务,即在执行完每个语句之后就会自动提交事务。
3.事务的四个属性ACID(1)原子性Atomicity
1.事务必须是原子工作单元。事务中进行的修改,要么全部执行,要么全都不执行;
2.在事务完成之前(提交指令被记录到事务日志之前),系统出现故障或重新启动,SQL Server将会撤销在事务中进行的所有修改;
3.事务在处理中遇到错误,SQL Server通常会自动回滚事务;
4.少数不太严重的错误不会引发事务的自动回滚,如主键冲突、锁超时等;
5.可以使用错误处理来捕获第4点提到的错误,并采取某种操作,如把错误记录在日志中,再回滚事务;
6.SELECT @@TRANCOUNT可用在代码的任何位置来判断当前使用SELECT @@TRANCOUNT的地方是否位于一个打开的事务当中,如果不在任何打开的事务范围内,则该函数返回0;如果在某个打开的事务返回范围内,则返回一个大于0的值。打开一个事务,@@TRANCOUNT=@@TRANCOUNT+1;提交一个事务,@@TRANCOUNT-1。
(2)一致性Consiitency
1.同时发生的事务在修改和查询数据时不发生冲突;
2.一致性取决于应用程序的需要。后面会讲到一致性级别,以及如何对一致性进行控制。
(3)隔离性Isolation
1.用于控制数据访问,确保事务只访问处于期望的一致性级别下的数据;
2.使用锁对各个事务之间正在修改和查询的数据进行隔离。
(4)持久性Durability
1.在将数据修改写入到磁盘上数据库的数据分区之前会把这些修改写入到磁盘上数据库的事务日志中,把提交指令记录到磁盘的事务日志中以后,及时数据修改还没有应用到磁盘的数据分区,也可以认为事务时持久化的。
2.系统重新启动(正常启动或在发生系统故障之后启动),SQL Server会每个数据库的事务日志,进行回复处理。
3.恢复处理包含两个阶段:重做阶段和撤销阶段。
4.前滚:在重做阶段,对于提交指令已经写入到日志的事务,但数据修改还没有应用到数据分区的事务,数据库引擎会重做这些食物所做的所有修改。
5.回滚:在撤销阶段,对于提交指令没有写入到日志中的事务,数据库引擎会撤销这些事务所做的修改。(这句话需要research,可能是不正确的。因为提交指令没有写入到数据分区,撤销修改是指撤销哪些修改呢???)
二、锁 1.事务中的锁
(1)SQL Server使用锁来实现事务的隔离。
(2)事务获取锁这种控制资源,用于保护数据资源,防止其他事务对数据进行冲突的或不兼容的访问。
2.锁模式(1)排他锁
a.当试图修改数据时,事务只能为所依赖的数据资源请求排他锁。
b.持有排他锁时间:一旦某个事务得到了排他锁,则这个事务将一直持有排他锁直到事务完成。
c.排他锁和其他任何类型的锁在多事务中不能在同一阶段作用于同一个资源。
如:当前事务获得了某个资源的排他锁,则其他事务不能获得该资源的任何其他类型的锁。其他事务获得了某个资源的任何其他类型的锁,则当前事务不能获得该资源的排他锁。
(2)共享锁
a.当试图读取数据时,事务默认会为所依赖的数据资源请求共享锁。
b.持有共享锁时间:从事务得到共享锁到读操作完成。
c.多个事务可以在同一阶段用共享锁作用于同一数据资源。
d.在读取数据时,可以对如何处理锁定进行控制。后面隔离级别会讲到如何对锁定进行控制。
3.排他锁和共享锁的兼容性(1)如果数据正在由一个事务进行修改,则其他事务既不能修改该数据,也不能读取(至少默认不能)该数据,直到第一个事务完成。
(2)如果数据正在由一个事务读取,则其他事务不能修改该数据(至少默认不能)。
4.可锁定的资源的类型 RID、KEY(行)、PAGE(页)、对象(例如表)、数据库、EXTENT(区)、分配单元(ALLOCATION_UNIT)、堆(HEAP)、以及B树(B-tree)。
RID: 标识页上的特定行
格式: fileid: pagenumber: rid (1:109:0 )
其中fileid标识包含页的文件, pagenumber标识包含行的页,rid标识页上的特定行。
fileid与sys.databases_files 目录视图中的file_id列相匹配
例子:
在查询视图sys.dm_tran_locks的时候有一行的resource_description列显示RID 是1:109:0 而status列显示wait,
表示第1个数据文件上的第109页上的第0行上的锁资源。