查询优化与事务处理——触发器、事务、锁

一、认识触发器:

触发器是在对表进行插入.更新或删除操作时自动执行的存储过程。触发器通常用于强制业务规则,是--种高级约束.可以定义比用CHECK约束更为复杂的约束,可执行复杂的SQL语句〈如F/WHLE/CASE),可引用其他表中的列。触发器主要是通过事件进行触发而被执行的.而存储过程可以通过存储过程名称而被直接调用。当对某一表进行修改,如UPDATE、NSERT、DELETE这些操作时,SQL Server 会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合由这些SQL语句所定义的规则。由此触发器可分为以下几种。

1.INSERT触发器:当向表中插入数据时触发.自动执行触发器所定义的SQL语句。

2.UPDATE触发器:当更新表中某列、多列时触发.自动执行触发器所定义的SQL语句。

3.DELETE触发器:当删除表中记录时触发.自动执行触发器所定义的SQL语句。

1.2 deleted表和inserted表:

 每个触发器有两个特殊的表:删除表(deleted表)和插入表(inserted表)。这两个表是逻辑表.并且这两个表是由系统管理的,存储在内存中,不是存储在数据库中,因此不允许用户直接对其进行修改。`

1.3 触发器的作用:

1)强化约束
触发器能够实现比CHECK语句更为复杂的约束。
约束和触发器在特殊情况下各有优势。触发器的主要优势在于它可以包含使用T-SQL代码的复杂处理逻辑。因此.触发器可以支持约束的所有功能。

2〉跟踪变化
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的更新和变化。

3)级联运行
触发器可以侦测数据库内的操作.并自动地级联影响整个数据库的各项内容。例如.某个表上的触发器中包含对另外--个表的数据操作.如删除.更新、插入,而该操作又导致该表上触发器被触发。触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。

 

1.4 创建触发器: 

CREATETRIGGER trigger_nameON table_name
【wITH ENCRYPTION]
FOR { [DELETE,工NSERT,UPDATE])
As SQL语句

二、认识事务: 

SQL Server通过支持事务机制以保证数据的一致性。事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一-个整体一起向系统提交或撤销操作请求,即这一-组数据库命令要么都执行.要么都不执行。因此,事务是--个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是作为最小的控制单元来使用的,它特别适用于多用户同时操作的数据库系统。

事务是作为单个逻辑工作单元执行的-系列操作。-个逻辑工作单元必须有四个属性.即原子性(Atomicity)、一致性(Consistency)、隔离性(lsolation)及持久性(Durability),这些特性通常简称为ACD。

1.原子性
事务是一-个完整的操作。事务的各元素是不可分的(原子的)。事务中的所有元素必须作为一个整体提交或回滚。如果事务中的任何元素失败,则整个事务将失败。
2.一致性
当事务完成时.数据必须处于一致状态。也就是说.在事务开始之前,数据库中存储的数据处于一致状态。在正在进行的事务中,数据可能处于不一致的状态.如数据可能有部分修改。然而,当事务成功完成时.数据必须再次回到已知的一-致状态。通过事务对数据所做的修改不能损坏数据.或者说事务不能使数据存储处于不稳定的状态。

3.隔离性
对数据进行修改的所有并发事务是彼此隔离的.这表明事务必须是独立的.它不应以任何方式依赖于或影响其他事务。修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。

4、持久性
事务的持久性指不管系统是否发生了故障,事务处理的结果都是永久的。

三、认识锁:

多个用户能够同时操纵同一个数据库中的数据.会发生数据不一致现象。也就是说.如果没有锁定且多个用户同时访问一个数据库,则当事务同时使用相同的数据时可能会发生问题。这些问题包括丢失.更新.脏读.不可重复读和幻觉读。数据库加锁就是为了解决以上的问题。

3.2 锁的模式:

1.共享锁(S锁):用于读取资源所加的锁。拥有共享锁的资源不能被修改。共享锁在默认情况下是读取了资源马上被释放。例如,读100条数据.可以想象成读完了第一条,马上释放第一条,然后给第二条数据上锁.再释放第二条.再给第三条上锁。以此类推直到第100条。

2.排他锁(X锁):和其他任何锁都不兼容,包括其他排他锁。排他锁用于数据修改。当资源上加了排他锁时,其他请求读取或修改这个资源的事务都会被阻塞,直到排他锁被释放为止.

3.更新锁(U锁}:U锁可以看作S锁和×锁的结合,用于更新数据,更新数据时首先需要找到被更新的数据,此时可以理解为被查找的数据上了S锁。当找到需要修改的数据时.需要对被修改的资源上×锁。SQL. Server通过U锁来避免死锁问题。因为S锁和S锁是兼容的.通过U锁和S锁兼容,使更新查找时并不影响数据查找.而U锁和U锁之间并不兼容.从而减少了死锁可能性。

四、实验:

4.1 实验描述:

创建一个UPDATE触发器,以确保xueyuan表中的数据不会被更改。

查询优化与事务处理——触发器、事务、锁_第1张图片

查询优化与事务处理——触发器、事务、锁_第2张图片
 

4.2使用系统存储过程查看相关信息:

查看数据库的信息。

exec sp_databases

查询优化与事务处理——触发器、事务、锁_第3张图片 

查看数据库中可查询的表或视图的信息。

exec sp_tables

查询优化与事务处理——触发器、事务、锁_第4张图片 

查看数据库中xueyuan表的约束。

exec sp_helpconstraint xueyuan

查询优化与事务处理——触发器、事务、锁_第5张图片 

查看数据库中 xueyuan表的索引。

exec sp_helpindex xueyuan

查询优化与事务处理——触发器、事务、锁_第6张图片 

查看数据库中的所有存储过程。

exec sp_stored_procedures

查询优化与事务处理——触发器、事务、锁_第7张图片 

查看在实验案例三中创建的触发器的实际文本。

exec sp_helptext xiugai

查询优化与事务处理——触发器、事务、锁_第8张图片 


 




 


 




 

 

你可能感兴趣的:(数据库)