加入收藏 | 设为首页 | 会员中心 | 我要投稿 南通站长网 (https://www.0513zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 系统 > 正文

sqlserver中事务和锁怎样理解?一文带你看明白事务和锁

发布时间:2022-04-26 08:55:26 所属栏目:系统 来源:互联网
导读:这篇文章给大家分享的是有关sqlserver 事务和锁的内容,对于新手来说sqlserver 事务和锁都是比较难理解的知识,为了帮助大家更好的理解sqlserver的事务和锁,下面给大家具体介绍一下。 事务 1 何为事务 预览众多书籍,对于事务的定义,不同文献不同作者对其
       这篇文章给大家分享的是有关sqlserver 事务和锁的内容,对于新手来说sqlserver 事务和锁都是比较难理解的知识,为了帮助大家更好的理解sqlserver的事务和锁,下面给大家具体介绍一下。
 
       事务
 
       1   何为事务
 
        预览众多书籍,对于事务的定义,不同文献不同作者对其虽有细微差别却大致统一,我们将其抽象概括为:
 
       事务:指封装且执行单个或多个操作的单个工作单元,在SqlServer中,其定义表现为显示定义和隐式定义两种方式。
       基于如上的定义,我们可以将事务解剖拆分为如下几个点:
 
       (1)事务是单个工作单元,这一定义,才使事务具有ACID属性
 
       (2)事务是封装操作的,如封装基本的CRUD操作
 
 --事务
 Begin Tran
 SELECT * FROM UserInfo
 INSERT INTO UserInfo VALUES('Alan_beijing',35)
 UPDATE UserInfo SET Age=31 WHERE UserName='Alan_beijing'
 DELETE UserInfo WHERE UserName='Alan_beijing'
 Commit Tran
       (3)事务在封装操作时,可以封装单个操作,也可以封装多个操作(封装多个操作时,应注意与批处理的区别)
 
       (4)在SqlServer中,事务的定义分为显示定义和隐式定义两种方式
 
       显示定义:以Begin Tran作为开始,其中提交事务为Commit Tran,回滚事务为RollBack Tran,如我们在一个事务中插入两条操作语句
 
--显示定义事务
Begin Tran
INSERT INTO UserInfo VALUES('Alan_shanghai',30)
INSERT INTO UserInfo VALUES('Alan_beijing',35) Commit Tran
       隐式定义:如果不显示定义事务,SQL Server 默认把每个语句当作一个事务来处理(执行完每个语句之后就自动提交事务)
 
       2   事务的ACID属性
 
       事务作为单个工作单元,该定义使其具有ACID属性,ACID属性指原子性(Atomicity)、一致性(Consisitency)、隔离性(Isolation)和持久性(Durability)。
 
       (1)原子性(Atomicity)
 
       原子性指事务必须是原子工作单元,即对于事务的封装操作,要么全部执行,要么全都不执行。如下情况均会导致事务的撤销或回滚。
 
       a.事务提交之前,系统发生故障或重新启动,SQL Server将会撤销在事务中进行的所有操作;
 
       b.事务处理中遇到错误,SQL Server通常会自动回滚事务,但也有少数例外;
 
       c.一些不太严重的错误不会引发事务的自动回滚,如主键冲突,锁超时等;
 
       d.可以使用错误处理代码来捕获一些错误,并采取相应的操作,如把错误记录在日志中,再回滚事务等;
 
       (2) 持久性(Durability)
 
        我们对数据表进行操作时,一般会按照先后顺序执行如下两步:
 
       第一步:将对数据表操作写入到磁盘上数据库的事务日志中(持久还到磁盘事务日志中);
 
       第二步:完成第一步后,再将对数据表操作写入到磁盘上数据库的数据分区中(持久化到磁盘上数据库分区中);
 
       关于如上两步,我们来想想可能发生的问题:
 
       问题1:完成如上第一步之前,系统发生故障(如系统异常,系统重启),数据库引擎会怎么做?
 
      由于未完成第一步,提交指令还未记录到磁盘的事务日志中,此时事务并未持久化,系统发生故障后,SQL Server会检查每个数据库的事务日志,进行恢复处理(恢复处理一般分为重做阶段和撤销阶段),此时的恢复处理为重做阶段,即提交指令还未记录到磁盘的事务日志中,数据库引擎会撤销这些事务所做的所有修改,这个过程也成为回滚。
 
       问题2:完成如上第一步但还未完成第二步,系统发生故障(如系统异常,系统重启),数据库引擎会怎么做?
 
       完成第一步后,提交指令已记录到磁盘的事务日志中,无论数据操作是否被写入到磁盘的数据分区,此时事务已持久化,系统发生故障后,SQL Server会检查每个数据库的事务日志,进行恢复处理(恢复处理一般分为重做阶段和撤销阶段),此时的恢复处理为重做阶段,即由于数据修改还没有运用到数据分区的事务,数据库引擎会重做这些事务所做的所有修改,这个过程也成为前滚。

(编辑:南通站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读