《事务的使用》
关于事务,我今天要把自己放在一个初学者的心态来写这篇文章。之前几篇文章大多讲的是对于Winner的应用,今天要从根本上来讲
一下“事务”,以及事务在Winner中的应用。
首先从基础讲起,什么是“事务”?事务能帮我们解决哪些问题? 摘录百度上的一段话教科书式的文字:
“数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。”
其实很好理解,比如说我们的商品购物流程中支付成功之后要做的几步操作:
1,修改订单表该状态;
2,修改库存表库存数量;
3,添加物流表发货信息;
三个操作必须一气呵成,这时候就需要串联事务,当一个操作失败之后,事务就回滚整个业务失败。当操作成功之后,所有操作才最终持久化执行。
假设我们没有事务的话,会怎么样?
还是上面三个流程,没有联事务就有可能出现以下情况:
步骤一: 修改订单表该状态 (完成)
步骤二:修改库存表库存数量 (完成)
步骤三:添加物流发货信息(失败)
当步骤三失败,由于没有事务回滚,程序中就必须得通过程序判断步骤三得到失败后,再操作“步骤二”中库存订单数量回到未修改前的值。
同事还要还原“步骤一”中订单表的订单状态。
而且,如果数据库健壮性不够,有可能导致二次修改步骤一,步骤二失败,造出数据库一片混乱。
这就是为什么我们要使用事务,事务有四大特性(百度摘录):
原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性:事务在完成时,必须使所有的数据都保持一致状态。
隔离性:由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。
持久性:事务完成之后,它对于系统的影响是永久性的。
这些其实我也早忘了,毕竟工作多年以后也不会有这样的考试,读书那会还是记得挺清楚的,只是那会不能感受到
事务的重要性,那时候的老师也不管那么多就照本宣科的讲,那些是以后工作生涯的重点,有时候老师自己都不知道
造成了我们可能花很多时间去理解“游标”,“函数” 这些压根用不着几次的东西。
开始事物:begin transaction
提交事物:commit transaction
回滚事物:rollback transaction
begin transaction declare @errorSum int --定义局部变量 set @errorSum=0 --初始化临时变量 update bank set currentMoneycurrentMoney= currentMoney-1000 where customerName='张三' set @errorSum=@errorSum+@@error --累计是否有错误 update bank set currentMoneycurrentMoney= currentMoney+1000 where customerName='李四' set @errorSum=@errorSum+@@error --累计是否有错误 if @errorSum<>0 --如果有错误 begin rollback transaction注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。