[聚合文章] 程序员的自我救赎---1.3:事务的使用

程序员 2017-11-29 16 阅读

《前言》

《目录》

(一) Winner2.0 框架基础分析

(二) 短信中心

(三)SSO单点登录

(四)PLSQL报表系统

(五)钱包系统

(六)GPU支付中心

(七)权限系统

(八)监控系统

(九)会员中心

(十)消息中心

(十一)Winner前端框架与RPC接口规范讲解

(十二)上层应用案例

 (十三)番外篇

 

《事务的使用》

 

关于事务,我今天要把自己放在一个初学者的心态来写这篇文章。之前几篇文章大多讲的是对于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
                

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。