详解SQL Server中的事务与锁问题

2020-07-04 06:01:11易采站长站整理

一  概述

在数据库方面,对于非DBA的程序员来说,事务与锁是一大难点,针对该难点,本篇文章试图采用图文的方式来与大家一起探讨。

“浅谈SQL Server 事务与锁”这个专题共分两篇,上篇主讲事务及事务一致性问题,并简略的提及一下锁的种类和锁的控制级别。

下篇主讲SQL Server中的锁机制,锁控制级别和死锁的若干问题。

二   事务

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.可以使用错误处理代码来捕获一些错误,并采取相应的操作,如把错误记录在日志中,再回滚事务等;

相关文章 大家在看