SQL高级(事务和触发器)

 

事务

四大属性

      1,原子性:事务是一个完整的整体,要么都执行,要么都不执行

      2,一致性:当事务完成时,数据必须处于一致状态

      3,隔离性:对数据修改的所有并发事务是彼此隔离的,即事务必须是独立的,不应以任何方式依赖于或影响其他

      4,永久性:事务完成后,对数据库的操作永久保留

事务控制

      BEGIN:开始事务

      COMMIT:提交事务,COMMIT 命令用于保存事务对数据库所做的更改。

      ROLLBACK:回滚事务,ROLLBACK 命令用于撤销尚未保存到数据库中的事务。

      一旦事务提交或回滚,则事务结束。

注:为判断语句执行是否出错,可使用全局变量@@ERROR。

举个栗子

       题目:改变B表中张三的性别为2时,王五更改为1

 

 代码如下:

 

--开始事务
begin tran
--定义变量,存储错误变量
declare @cw int
set @cw=0
update B set sex=2 where name='张三'
--用@@ERROR判断语句执行是否成功
set @cw+=@@ERROR
update B set sex=1 where name='王五'
set @cw+=@@ERROR
--判断语句执行是否成功
if(@cw<>0)
begin
--不等于0,语句出错,回滚事务
print '语句执行失败,已回滚'
rollback tran
end
else
begin
--等于0,提交事务
print '语句执行成功,已提交'
commit tran
end

 

结果:

 

 

       其实最适合使用事务的,是类似于转账一类的操作,一边余额减少,一边余额就要增加,如果余额减少失败,事务回滚,那么相应的,另一边的余额也就不会再增加

 

触发器

 

DML触发器:
  用户通过数据操作语句 DML(对表或视图的insert、delete、update)编辑数据,则执行DML触发器。系统将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误,则整个事务自动回滚。

举个栗子:

      有题:--A表张三语文成绩减1,就给B表王五的出生年月加1

表A

 表B

 

代码:

--判断触发器是否存在
if exists(select * from sys.triggers where name='trig_update')
drop trigger trig_update
go
--创建触发器
create trigger trig_update
--在A表中创建
on A
--修改触发器
for update
--当触发触发器后要做的操作
as

--定于变量存储错误信息
declare @a int
set @a=0
update B set chusheng+=1 where name='王五'
set @a+=@@ERROR

--不等于0则修改失败
if(@a<>0)
begin
print '王五信息修改失败'
end
else
begin
print '王五信息修改成功'
end
go

 

结果:

 

 

       此触发器执行的就是DML触发器里的update,当A表发生改变,相应的B表也应该进行相关操作,值得注意的是,在update里面,要修改的数据和被修改的数据不能来自同一张表

 

 

posted @ 2022-10-07 23:48  LEEZiiJia  阅读(287)  评论(0编辑  收藏  举报