看一下如下需求的产生及解决方案
开始事务
1.同一数据库内划账
2.数据库间划账
3.向某用户发信
4.将本地一文件上传到指定服务器
5.将远程主机一目录内容同步到本地目录
6.向连接到本机COM口一电机发出指令,向水池蓄100升水
7.关闭远程一计算机
结束事务
要求,1,2,3,4,5,6,7的操做在同一事物内完成
看一看在解决上述问题时,事物回滚,事物提交,事物准备,事物挂起,事物通知,事物回退,事物回调,事物并行,事物串行,事物资源补偿,资源锁 ,等的问题是如何出现,并如何解决的
///////////////////////////////////////////////////////
先从一个小问题开始..............
假如有这样一个数据库,
/////////////
用户|钱数
a |500
b |600
/////////////
两个用户之间的划账问题,
这里假设不需要或我不会使用交易流水账的方式跟踪交易活动,使用汇总的方式体现钱数的变化。
在这里我且只用update [钱数] 的方式进行用户间的划账.
////////////////////////////////////////
需求1:a用户给b用户划自已支配数额的账
设计如下:
.............................
x1=a要划的账
x2= select 钱数 where a用户
if x2 < x1
update 钱数-x1 where a用户
update 钱数+x1 where b用户
..............................
OK 设计完成! 没有问题! 没有问题..............
但在[update 钱数-x1 where a用户] 后,b用户就消户了,[update 钱数+x1 where b用户]没有执行对象了
代码作如下修改:
.............................
x1=a要划的账
x2= select 钱数 where a用户
if x2 < x1
update 钱数-x1 where a用户
如果 [update 钱数+x1 where b用户] 不成功
update 钱数+x1 where a用户
..............................
OK ,问题解决!
但.....
如果在[update 钱数-x1 where a用户] 后数据库就当掉
如果[update 钱数-x1 where a用户] 就出错
如果[update 钱数+x1 where a用户] 时数据库当掉
........................
接着改代码,这是一个焦油潭....
以上问题由数据库开发商提供解决方案(他的解决方案以后再说)
事物处理(将操作数据的代码放入存储过程,由数据库处理)
.........................................
BEGIN TRANSACTION 事务
Begin
update 钱数-x1 where a用户
update 钱数+x1 where b用户
If @@error=0
Commit Transaction 事务
Else
Rollback Transaction 事务
End
..........................................
OK ,问题解决!,至少前台开发人员问题解决,再有问题找数据库开发人员或数据库提供商
到此先放前台开发人员一马(一会再烦他)
看一下数据库开发人员要面对的一个问题....
浙公网安备 33010602011771号