怎样进行“数据回滚”?     一条数据到数据库的处理流程:1、查询数据配置信息。2、“数据合法性”和“插入数据历史表”并发执行。3、计算“合法”数据的“增量”。4、“插入增量表”、“更新实时数据”、“插入/更新年月日时”表。问题一:如果“数据合法性”后的“插入增量表”、“更新实时数据”、“插入/更新年月日时”表“执行失败了”,但是“插入数据历史表”执行成功了,这是就会造成“数据的不统一”,怎么办?问题二:增量计算出来以后,“更新实时数据”成功了,但是“插入增量表”和“插入/更新年月日时”表失败了,怎么办?   怎么保证各个过程之间的数据完整性?
问题三:在并发处理的情况下,怎样保证数据的完整性?

解决方案 »

  1.   

    declare @err int
    set @err=0
    begin tran
    你的数据库语句
    select @err=@@error
    if @err=0
    begin
    commit tran
    end
    else 
    begin
    rollback tran
    end
      

  2.   

    在事务中,rollback就是回滚。
      

  3.   

    使用事务。
    begin transaction
    数据操作
    If @errno>0 
      rollback TransAction 
    else
      Commit TransAction
      

  4.   


    SET XACT_ABORT ON
    BEGIN TRANSACTION--执行你的操作COMMIT TRANSACTION
      

  5.   

    有大师指出:
    在"Command" 中使用事务,大师有这样的例子可以参考吗???       如果"Command" 是执行“存储过程”的,那么事务不还是要写在“存储过程”中???
      

  6.   

    不是去执行存储过程,把存储过程里的代码移到程序代码里,不用存储过程了把这些sql语句都放在程序里,不要放在存储过程里还有就是不是所有的代码哦,是需要使用事物的代码,不知道你理解不因为我还在出差,所以不能给你例子这样的话可以避免一些死锁
      

  7.   

    command的 conn不是可以使用事务吗?
    或者 sql语句里写事务控制 在command里执行 
      

  8.   

    一个大师说:不是去执行存储过程,把存储过程里的代码移到程序代码里,不用存储过程了把这些sql语句都放在程序里,不要放在存储过程里还有就是不是所有的代码哦,是需要使用事物的代码,不知道你理解不因为我还在出差,所以不能给你例子这样的话可以避免一些死锁
    有没有类似“SqlCommand”执行事故的实例???
      

  9.   

    这种并发的情况怎么用“事故控制”呢???          “事故控制”的都是顺序执行的过程。比如:       “过程1”、“过程2”、“过程3”、“过程4”、“过程5”、“过程6”是一起执行的,它们分别操作表T1、T2、T3、T4、T5、T6。也就是要完成就一起完成,有一个完不成,其它的几个也不去执行。   如果用一个“事故”包含“过程1”、“过程2”、“过程3”、“过程4”、“过程5”、“过程6”,那么他们必然是“顺序执行”的,也就是执行完“过程1”,然后执行“过程2”,接着是“过程3”。      如果要并发,怎么办???
    用多线程的话,:             “过程1”、“过程2”、“过程3”、“过程4”、“过程5”、“过程6”这样的“6个线程”同时执行,如果6个都成功那么结束,如果有一个不成功,那么执行方法“删除操作的表T1、T2、T3、T4、T5、T6中”的数据。
            这样的情况用事故可以吗???    只能用程序控制吗???
      

  10.   

    set XACT_ABORT on
    begin tran
    --你的SQL语句例如如下id为主键
    insert into tra(id,name) select '3','r3'
    insert into tra(id,name) select '3','r3'
    commit
      

  11.   

    用银行转账的例子演示吧
     --建表 
         create table card1 (cardid int,remain float)
     create procedure mypro1
     @incount int,
     @outcount int,
     @amount float
     as
      
     begin
     declare @total  float
     select @total=remain   from card1 where cardid=@outcount
     
     
     if @total>=@amount 
     begin
     update card1
     set remain=remain-@amount where cardid=@outcount
     update card1
     set remain=remain+@amount where cardid=@incount
    end
     
     end
     insert card1 values(1,1000.0)
     insert card1 values(2,500.0)
     exec mypro1 2,1,200
     select * from card1
    sp_help stu
     create procedure mypo2() 
     
     as insert into stu(sno,sname) values('95051','小明')
     go
     exec  mypo2
     select * from stu
     create table card2(cardid int,remain float)
     
     drop procedure mypro2
     create procedure mypro2
     @outid int,
     @inid int,
     @money float
     as 
     begin 
        declare @total float
        select @total=remain from card2 where cardid=@outid
         begin transaction t1--设回滚点
         if @total>@money 
         begin 
           
              update card2
              set remain=remain-@money where cardid=@outid
              
            
              update card2
              set remain=remain+@money where cardid=@inid
              print'转账成功'
              commit transaction t1--提交事务
      
           
             end
                else 
                begin
                print '转账失败'
                rollback transaction t1--回滚
               end
            
                end
               
              insert card2 values(1,1000.0)
    insert card2 values(2,1000.0)
    exec mypro2 2,1,1689
    select * from card2
      

  12.   

    用数据库事物控制如果你操作成功了  就commit提交
    否则就rollback回滚
      

  13.   


    问题:1、“SQL执行成功,就commit提交。”   ,   SQL都执行成功了,再“commit”提交,提交什么呢???   都已经成功了啊。  提交什么呢?
    2、“失败就rollback回滚。  ”  ,  SQL是怎么进行的回滚操作?   它是怎样处理的,为什么可以将之前做的操作回滚回去呢?
      

  14.   

    当你的sql包在事务中时,那个不是真正的成功,要commit才会提交到日志中。回滚的话也是在日志中回滚的。如果没提交或者回滚,其他会话只能看到修改前的状态。
      

  15.   

    希望可以帮到你:代码如下create table 自动转账机
    (
    卡号 varchar(19) primary key,
    金额 money check(金额>=0)
    )
    insert into 自动转账机 values('6222023100051898533',120.00)
    insert into 自动转账机 values('6222023100051898573',0.00)
    create table 自动取款机
    (
    卡号 varchar(19) primary key,
    金额 money check(金额>=100)
    )
    insert into 自动取款机 values('6222023100051898533',120.00)
    insert into 自动取款机 values('6222023100051898573',0.00)--转账 余额不足 数据回滚 转账失败
    begin try
    begin tran
    update 自动转账机 set 金额 = 金额+500 where 卡号 = '6220203200051898533'
    update 自动转账机 set 金额 = 金额-500 where 卡号 = '6220203200051898573' 
    commit tran --执行成功
    end try
    begin catch
    rollback tran --余额不足 数据回滚
    end catch--取款 余额不足 数据回滚
    begin try
    begin tran
    update 自动取款机 set 金额 = 金额-500 where 卡号 = '6220203200051898573' 
    commit tran --执行成功
    end try
    begin catch
    rollback tran --余额不足 数据回滚
    end catchselect * from 自动转账机
    select * from 自动取款机drop table 自动转账机
    drop table 自动取款机
      

  16.   

    事故不能夸“Session”的对吧。
      

  17.   


    提交到“日志中”才算成功???       SQLServer的日志很重要吗???
      

  18.   

    问题:
         在“SQL”中还有“Try  Catch”语句啊,它和“事故”结合使用呀。
      

  19.   

    那是因为你不会管理日志而已,参考:
    http://blog.csdn.net/dba_huangzj/article/details/7982945
      

  20.   

    大师,日志中记录了什么?   为什么那么重要呢???
    事故处理,使用“Try  catch”
    和“设置回滚点”是不同的操作吧。
      

  21.   

    你的每一步操作都先记录到事务日志里面,到checkpoint或者lazywriter的时候才把“已提交”的写入数据文件。也就是说所有东西先进入日志再进入数据文件,如果直接删除,那么里面未写入数据文件的东西就丢失。
      

  22.   


    哦。大师所有的数据库操作都是先进入“日志文件”,然后再进入“数据库文件”的吗???不使用“事故”也是这样的吗???
    另外,还想问一下大师。
    为什么“SqlServer”使用“openrowset”可以从“Oracle”数据库中取数据???这是为什么呢???