小弟在做程序的时候遇到这样一个业务,对多个表进行delete 或 update 处理,
如果在update 其中某一个表的时候发生错误,会谈出一个对话框(YES or No),如果用户选择Yes 则忽略这个表的错误继续对余下的表Update,最后未出错的表Commit,
所有出错了的表则rollback.如果执行全部正常,则把对所有表的操作当作一个事务一起提交。如果用户选择No 则把已经操作过的表全部rollback,然后退出处理。从Yes的情况考虑,好像需要把每个表的操作都当作一个事务,这样才能实现对单表的rollback.
可是从No的情况考虑,又需要把所有表的操作一起当作一个事务,这样才能实现所有表一起的rollback。所以最后考虑了一下用事务的嵌套来解决。流程是这样:
Transaction1 Begin
for 要删表的个数
try
Transaction2 Begin
Delete Table(i)
catch(Exception e)
弹出对话框
Yes:
throw(e)
Transaction2.rollback
mblnError = False
continue
No:
throw(e)
mblnError = True
break '推出循环
Next i if mblnError then
Transaction1.rollback
else
Transaction1.commit
End if这样看起来好像是行,但却有一个问题,Transaction的定义是根据连接来的,即
Transaction1 = Connection1.BeginTranction() /* 我用的是VB.net */
而且在程序里只允许我打开一个连接,这样我好像就不能同时拥有Transaction1和Transaction2,
那我就无法实现上面的逻辑。事情就是这样地,希望各位大虾能指教一下怎样用事务的嵌套来解决我说的这个业务逻辑。
如果在update 其中某一个表的时候发生错误,会谈出一个对话框(YES or No),如果用户选择Yes 则忽略这个表的错误继续对余下的表Update,最后未出错的表Commit,
所有出错了的表则rollback.如果执行全部正常,则把对所有表的操作当作一个事务一起提交。如果用户选择No 则把已经操作过的表全部rollback,然后退出处理。从Yes的情况考虑,好像需要把每个表的操作都当作一个事务,这样才能实现对单表的rollback.
可是从No的情况考虑,又需要把所有表的操作一起当作一个事务,这样才能实现所有表一起的rollback。所以最后考虑了一下用事务的嵌套来解决。流程是这样:
Transaction1 Begin
for 要删表的个数
try
Transaction2 Begin
Delete Table(i)
catch(Exception e)
弹出对话框
Yes:
throw(e)
Transaction2.rollback
mblnError = False
continue
No:
throw(e)
mblnError = True
break '推出循环
Next i if mblnError then
Transaction1.rollback
else
Transaction1.commit
End if这样看起来好像是行,但却有一个问题,Transaction的定义是根据连接来的,即
Transaction1 = Connection1.BeginTranction() /* 我用的是VB.net */
而且在程序里只允许我打开一个连接,这样我好像就不能同时拥有Transaction1和Transaction2,
那我就无法实现上面的逻辑。事情就是这样地,希望各位大虾能指教一下怎样用事务的嵌套来解决我说的这个业务逻辑。
在sqlplus下可以这样
savepoint a;
操作1
savepoint c;
操作2
savepoint b;
操作3rollback to a/b/c