1.数据库事务
1.一个事务内的所有语句代码作为一个整体来执行。
要么全部执行,要么全部不执行。当遇到错误时可以回滚事务,取消事务内所做的改变,从而保证数据库中的数据一致性和可恢复性。
2.显示事务
(1.)begin transaction :启动事务
(2.)commit transaction:提交事务
(3.)rollback transaction:回滚事务,表明在事务执行过程中遇到错误,事务内所修改的数据会被回滚到事务执行之前的状态
3.案例练习
--客户雷亚波在零聚网购买了两份”菠萝爆肉片“和一件“资生堂菲婷” 编写存储过程实现该业务
if exists(select * from sysobjects where name='proc_insertOrders') --查看数据库是否存在这个存储空间,如若存在则删除
drop procedure proc_insertOrders
GO
create proc proc_insertOrders(
@ordersDate varchar(20) , --下单日期
@customerName varchar(20) , --客户姓名
@title1 varchar(50) , --第一件商品名
@quantity1 int , --第一件商品数量
@title2 varchar(50) , --第二件商品名
@quantity2 int --第二件商品数量
)
as
declare @customerID int; --客户编号
declare @productID1 int; --第一件商品编号
declare @productID2 int; --第二件商品编号
declare @orderID int; --订单编号
select @customerID=customerId from customer where customerName=@customerName
begin transaction --启动事务
--添加订单表记录
insert orders(customerID,ordersDate) values(@customerID,convert(date,@ordersDate))
if @@error=0 --返回上一条执行SQL语句的错误号,如果为0表示订单表记录成功
begin
select @orderID=max(ordersID) from orders --获取新增订单的订单编号
select @productID1=productID from product where title=@title1 --获取第一件商品编号
--添加第一件商品到订单明细表
insert ordersdetail values(@orderID,@productID1,@quantity1)
select @productID2=productID from product where title=@title2 --获取第二件商品编号
--添加第二件商品到订单明细表
insert ordersdetail values(@orderID,@productID2,@quantity2)
if @@error = 0 --添加订单表和添加订单明细表记录成功
begin
print '添加订单成功'
commit transaction --提交事务
end
else
begin
print '添加订单失败'
rollback transaction --回滚事务
end
end
else
begin
print '添加订单失败'
rollback transaction --回滚事务
end
GO
--调用存储过程
exec proc_insertOrders '2021-9-27','雷亚波','菠萝爆肉片',2,'资生堂菲婷',1