| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1020 人关注过本帖
标题:以前没用过事务,怎么使用事务回滚?
取消只看楼主 加入收藏
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
结帖率:98.98%
收藏
已结贴  问题点数:20 回复次数:1 
以前没用过事务,怎么使用事务回滚?
*以下是1个简单的过程,要同时向2个表 test1,test2 插入数据,
*在VFP中这样调用就可以
id1=1
name1='a'
score1=1
out=0
SQLEXEC(con,"{call add_test(?id1,?name1,?score1,?@out1)}")
?out &&是可以正常返回要的值的,只是,不知道怎么回滚

*先在 test1找这个数据,存在返回 -1,不存在就往 test1 写数据
*检查刚才的数据有无成功写到 test1 去,没写进去返回 -2
*往 test2 写数据,检查 test2有无成功写数据,没写进去返回-3
*如果返回值 out1=-3时,表示 test2 没成功写数据,而 test1成功写数据,怎么利于事务来处理,回滚 test1 表
*或者用其他的比较好的方法也可以。

--sql2000 存储过程
alter proc add_test(@id1 as int,@name1 as varchar(10),@score1 as numeric(5,2),@out1 int output)
as
begin
set @out1=1

if exists(select id from test1 where id=@id1)
   set @out1=-1
else
   begin
     INSERT INTO test1(id,name,score) values(@id1,@name1,@score1)
     if not exists(select id from test1 where id=@id1)
        set @out1=-2
     else
        begin
         declare @id2 int
         set @id2=@id1 * @id1 --故意制造不同数据,造成ID 不相同
         INSERT INTO test2(id,name,score) values(@id2,@name1,@score1)
--       INSERT INTO test2(id,name,score) values(@id1,@name1,@score1)
          if not exists(select id from test2 where id=@id1)
             set @out1=-3
        end
  --在这里判断?

   end

end
2016-06-13 16:25
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
-自己测试出来了,不知道有没优化,或者经常使用事务的指教。在上楼的基础上,增加红字部分
create  proc add_test(@id1 as int,@name1 as varchar(10),@score1 as numeric(5,2),@out1 int output)
as
begin
set @out1=1
begin tran
if exists(select id from test1 where id=@id1)
   set @out1=-1
else
   begin
     INSERT INTO test1(id,name,score) values(@id1,@name1,@score1)
     if not exists(select id from test1 where id=@id1)
        set @out1=-2
     else
        begin
          declare @id2 int
          set @id2 = @id1 * @id1
          INSERT INTO test2(id,name,score) values(@id2,@name1,@score1) --故意改为ID2,这样前后记录不统一,测试回滚
          if not exists(select id from test2 where id=@id1)
             set @out1=-3
        end
   end
if @out1=-3
   rollback
else
   commit


end
2016-06-13 17:36
快速回复:以前没用过事务,怎么使用事务回滚?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016793 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved