Mysql:事务与触发器

#事务
#针对数据库的一组操作,它可以由一条或多条SQL语句组成,同一个事务的操作具有同步的特点,如果其中有一条无法执行,那么所有的语句都不会执行。
#开启事务  start transaction;
#提交事务  commit;
#回滚  rollback;  |rollback to <>
#设置事务保存点  savepoint <自命名>;
#注意:直接书写的SQL语句都是自动提交的,而事务中的操作语句都需要使用commit语句手动提交。不想要提交的事务可以回滚,但是回滚只针对未提交的事务提供回滚操作。
#例如:账户a转账给b100元
#start transaction;
#update account set money=money-100 where name='a';
#savepoint S1;   #设置保存点,下边如果使用rollback的回滚操作的话(rollback to savepoint S1;),那么回滚的将不是最初始的位置,而是从这个保存点开始
#update account set money=money+100 where name='b';
#select * from account;
#commit;   #提交事务   |    #rollback;  #回滚[撤销前边的操作]
#select * from account;
#打开另一窗口:
#use CH06;
#select * from account;

#事务的四个特性:
#原子性(指一个事务必须被视为一个不可分割的逻辑工作单元,要么全做。要么全不做)
#一致性(事务前后,无论执行成功还是处理失败,都要保证数据库系统处于一致的状态)
#隔离性(当一个事务在执行时,不会受到其他事务的影响,保证了未完成事务的所有操作与数据库系统的隔离,多个并发事务之间要相互隔离)
#持久性(事务一旦提交,事务对数据库中数据的修改就是永久性的)

#并发控制
#事务串行执行:DBMS按顺序一次执行一个事务,执行完才开始另一事务的执行。
#事务并发执行:DBMS同时执行多个事务对同一数据的操作,这里的并发是指在单处理器(一个CPU)上,利用分时方法实现多个事务同时操作

#并发控制可能出现的问题:丢失更新、不可重读、读脏数据

#show variables like 'transaction';


#触发器,是一种特殊的存储过程,它与数据表紧密相连。
#语法格式:
#delimiter //
#create trigger <触发器的名称>
#before(触发前) | after (触发后)
#insert |update |delete (用什么选项触发:插入时、更新时、删除时)
#on <数据表名>
#for each row (触发操作所涉及的每一行,都要受到触发事件的操作)
#begin(如果执行语句很长,那么使用delimiter和begin...end)
#执行语句
#end //
#delimiter ;

#查看所有触发器操作
#select * from information_schema.triggers
#查看指定触发器操作
#select * from information_schema.triggers where trigger_name like '触发器名称';
#删除指定触发器
#drop trigger 数据库名.触发器名;

#例:设置一个触发器在表商品类型中,触发点为在表中进行删除操作
delimiter //
create trigger t1
before delete on 商品类型 for each row
begin
    delete from 商品类型;
end //
delimiter ;
#当执行删除表商品类型时,触发上边的触发器删除点,防止了表进行数据的删除
delete from 商品类型 where 类型编号='t02';

#查看触发器操作
select * from information_schema.triggers where trigger_name like 't1';
#删除对应的触发器
drop trigger 李家旗.t1;


#练习:


#1.创建“商品库存”数据表和“购物车商品”数据表。“商品库存”数据表的结构数据如表1所示。“购物车商品”数据表的结构数据如表2所示。
create table 商品库存(商品编号 varchar(12) not null,商品名称 varchar(100),库存数量 int not null,最小库存数量 int);
create table 购物车商品(客户ID int not null,商品编号 varchar(12) not null,购买数量 smallint not null,优惠价格 decimal(8,2));
#2.向“商品库存”数据表中添加5条商品记录。向“商品库存”数据表中添加的商品记录如表3所示。
insert into 商品库存(商品编号,商品名称,库存数量,最小库存数量) values
('100009177424','华为Mate 30 5G',100,5),
('100011351676','小米10 Pro 双模5G',100,5),
('100013232838','海尔LU58J51',100,5),
('100013973228','美的KFR-35GW/N8MJA3',100,5),
('100014512520','格力KFR-72LW/NhAb3BG',100,5);
#3.在“购物车商品”数据表中创建一个触发器,当客户选购一件商品时(插入一条记录时),对应的“商品库存”数据表的“库存数量”字段值也同步减1。
delimiter //
create trigger t2
after insert on 购物车商品 for each row
begin
    update 商品库存 set 库存数量=库存数量-1 where 商品编号=new.商品编号;
end //
delimiter ;
#4.查询“商品库存”数据表的全部字段。
select * from 商品库存;

#5.向“购物车商品”数据表中插入一条数据, 客户ID为3,购买1台“华为Mate 30 5G”,优惠价格为4999。
insert into 购物车商品(客户ID,商品编号,购买数量,优惠价格) values (3,'100009177424',1,4999);
#6.查询“购物车商品”数据表的全部字段。
select * from 购物车商品;
#7.查询“商品库存”数据表的全部字段。看库存数是否正确。
select * from 商品库存;
 

运行结果图:

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值