SQL高级(事务和触发器)

饭宝  论坛元老 | 2022-10-8 00:47:47 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1664|帖子 1664|积分 4992

 
事务

四大属性
      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(@cw0)
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(@a0)
begin
print '王五信息修改失败'
end
else
begin
print '王五信息修改成功'
end
go
 
结果:

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

饭宝

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表