数据库事务:
数据库事务(Database Transaction) 是指作为单个逻辑工作单元执行的一系列操作。
事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。
设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作:
更新客户所购商品的库存信息
保存客户付款信息--可能包括与银行系统的交互
生成订单并且保存到数据库中 · 更新用户相关信息,例如购物数量等等 ��正常的情况下,这些操作将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,如果在这一系列过程中任何一个环节出了差错,例如在更新商品库存信息时发生异常、该顾客银行帐户存款不足等,都将导致交易失败。一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,比如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态--库存信息没有被更新、用户也没有付款,订单也没有生成。否则,数据库的信息将会一片混乱而不可预测。
数据库事务正是用来保证这种情况下交易的平稳性和可预测性的技术。
begin tran (或transaction) --开始事务
commit --提交事务
rollback --回滚事务
事务特性:
A原子性(atomicity)
C一致性(consistency)
I隔离性(isolation)
D持久性(durability)
@@ERROR 是判断事务有没有错的条件,无错时值为0,有错时值不为0。
事务创建以及使用示例:
select * from cangku begin tran --开始事务 insert into cangku values(10008,'Boxster',70,10,1004)--没有错 if @@ERROR >0 begin--每一个执行语句后面写这句话是为了如果上一句有错误, --下面不管有多少执行语句,都不会执行,直接到tranrollback goto tranrollback--到最后一个执行语句的tranrollback end insert into cangku values(10002,'极光',66.50,10,1002)--主键约束 if @@ERROR>0 goto tranrollback insert into cangku values(10009,'XF',40,10,1003)--没有错 if @@ERROR>0 begin tranrollback: --需要加上冒号 rollback tran --回滚所有事务中执行过的命令(撤销所有执行语句) end else begin commit tran --提交事务(只有真正的走到了commit才是真正的更改数据库的数据) end
练习:创建三个表并写一个简单的存储过程,要求可以进货、出货并打印小票。
在没有此货物并且为进货时,添加上这一行信息;
在没有此货物并且为出货时,打印没有此货物!
下面开始执行语句:
语句一:进货,编号为1001的货物新增10个
语句二:编号为1001的货物出货5台
在每次为出货并且数量够的情况下,会打印小票
语句三:新进货编号为1021
语句四:出货,编号为1022的货物出货,但是仓库中没有此编号的货物