首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

怎的进行“数据回滚”

2012-12-20 
怎样进行“数据回滚”?怎样进行“数据回滚”?一条数据到数据库的处理流程:1、查询数据配置信息。2、“数据合法性”

怎样进行“数据回滚”?
怎样进行“数据回滚”?     

一条数据到数据库的处理流程:

1、查询数据配置信息。

2、“数据合法性”和“插入数据历史表”并发执行。

3、计算“合法”数据的“增量”。

4、“插入增量表”、“更新实时数据”、“插入/更新年月日时”表。

问题一:如果“数据合法性”后的“插入增量表”、“更新实时数据”、“插入/更新年月日时”表“执行失败了”,但是“插入数据历史表”执行成功了,这是就会造成“数据的不统一”,怎么办?

问题二:增量计算出来以后,“更新实时数据”成功了,但是“插入增量表”和“插入/更新年月日时”表失败了,怎么办?   怎么保证各个过程之间的数据完整性?


问题三:在并发处理的情况下,怎样保证数据的完整性?

[最优解释]

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

[其他解释]
用银行转账的例子演示吧


 --建表 
     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
[其他解释]
使用事务。
begin transaction
数据操作
If @errno>0 
  rollback TransAction 
else
  Commit TransAction

[其他解释]


SET XACT_ABORT ON
BEGIN TRANSACTION

--执行你的操作

COMMIT TRANSACTION

[其他解释]
command的 conn不是可以使用事务吗?
或者 sql语句里写事务控制 在command里执行 
[其他解释]
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

[其他解释]
希望可以帮到你:代码如下

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 catch

select * from 自动转账机
select * from 自动取款机

drop table 自动转账机
drop table 自动取款机

[其他解释]
引用:
引用:
用数据库事物控制

如果你操作成功了  就commit提交
否则就rollback回滚

问题:

1、“SQL执行成功,就commit提交。”   ,   SQL都执行成功了,再“commit”提交,提交什么呢???   都已经成功了啊。  提交什么呢?


2、“失败就rollback回滚。  ”  ,  SQL是怎么进行的回滚操作?……
当你的sql包在事务中时,那个不是真正的成功,要commit才会提交到日志中。回滚的话也是在日志中回滚的。如果没提交或者回滚,其他会话只能看到修改前的状态。
------其他解决方案--------------------


当然用事务控制
[其他解释]
在事务中,rollback就是回滚。
[其他解释]
用数据库事物控制

如果你操作成功了  就commit提交
否则就rollback回滚
[其他解释]
事务,rollback
[其他解释]
有大师指出:


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


[其他解释]
不是去执行存储过程,把存储过程里的代码移到程序代码里,不用存储过程了

把这些sql语句都放在程序里,不要放在存储过程里

还有就是不是所有的代码哦,是需要使用事物的代码,不知道你理解不

因为我还在出差,所以不能给你例子

这样的话可以避免一些死锁
[其他解释]
一个大师说:

不是去执行存储过程,把存储过程里的代码移到程序代码里,不用存储过程了

把这些sql语句都放在程序里,不要放在存储过程里

还有就是不是所有的代码哦,是需要使用事物的代码,不知道你理解不

因为我还在出差,所以不能给你例子

这样的话可以避免一些死锁


有没有类似“SqlCommand”执行事故的实例???

[其他解释]
这种并发的情况怎么用“事故控制”呢???          

“事故控制”的都是顺序执行的过程。

比如:

       “过程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中”的数据。


        这样的情况用事故可以吗???    只能用程序控制吗???
[其他解释]

引用:
SQL code12345678910111213declare @err intset @err=0begin tran你的数据库语句select @err=@@errorif @err=0begincommit tranendelse beginrollback tranend


1楼 正解
[其他解释]
引用:
用数据库事物控制

如果你操作成功了  就commit提交
否则就rollback回滚


问题:

1、“SQL执行成功,就commit提交。”   ,   SQL都执行成功了,再“commit”提交,提交什么呢???   都已经成功了啊。  提交什么呢?


2、“失败就rollback回滚。  ”  ,  SQL是怎么进行的回滚操作?   它是怎样处理的,为什么可以将之前做的操作回滚回去呢?
[其他解释]
引用:
SQL code?1234567SET XACT_ABORT ONBEGIN TRANSACTION --执行你的操作 COMMIT TRANSACTION


这个不是可以吗

[其他解释]
事故不能夸“Session”的对吧。
[其他解释]
引用:
引用:事故不能夸“Session”的对吧。
这个应该叫分布式事务,正常的写法肯定搞不定了。


有这样的“分布式事故”吗?   大师???
------其他解决方案--------------------


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

这个应该叫分布式事务,正常的写法肯定搞不定了。
[其他解释]
引用:
引用:引用:引用:
用数据库事物控制

如果你操作成功了  就commit提交
否则就rollback回滚

问题:

1、“SQL执行成功,就commit提交。”   ,   SQL都执行成功了,再“commit”提交,提交什么呢???   ……
非常重要,如果非要在数据文件和日志文件中选优先级,那么一定是日志文件。
[其他解释]
引用:
引用:引用:
用数据库事物控制

如果你操作成功了  就commit提交
否则就rollback回滚

问题:

1、“SQL执行成功,就commit提交。”   ,   SQL都执行成功了,再“commit”提交,提交什么呢???   都已经成功了啊。  提交什么呢?


2、……


提交到“日志中”才算成功???       SQLServer的日志很重要吗???
[其他解释]
引用:
希望可以帮到你:代码如下

create table 自动转账机
(
卡号 varchar(19) primary key,
金额 money check(金额>=0)
)
insert into 自动转账机 values('6222023100051898533',120.00)
insert into 自动转账机 values('62220231000……



问题:
     在“SQL”中还有“Try  Catch”语句啊,它和“事故”结合使用呀。
[其他解释]
引用:
引用:引用:引用:引用:
用数据库事物控制

如果你操作成功了  就commit提交
否则就rollback回滚

问题:

1、“SQL执行成功,就commit提交。”   ,   SQL都执行成功了,再“com……


“日志文件”会随着数据库操作的“增多而增大”,它不是可以被删除一部分的吗?
[其他解释]
引用:
引用:引用:引用:引用:引用:引用:
用数据库事物控制

如果你操作成功了  就commit提交
否则就rollback回滚

问题:

1、……



大师,日志中记录了什么?   为什么那么重要呢???


事故处理,使用“Try  catch”
和“设置回滚点”是不同的操作吧。

[其他解释]
引用:
引用:引用:引用:引用:引用:
用数据库事物控制

如果你操作成功了  就commit提交
否则就rollback回滚

问题:

1、“SQL执行成功,就commit提交……
那是因为你不会管理日志而已,参考:
http://blog.csdn.net/dba_huangzj/article/details/7982945
[其他解释]
引用:
你的每一步操作都先记录到事务日志里面,到checkpoint或者lazywriter的时候才把“已提交”的写入数据文件。也就是说所有东西先进入日志再进入数据文件,如果直接删除,那么里面未写入数据文件的东西就丢失。


哦。大师。。。

所有的数据库操作都是先进入“日志文件”,然后再进入“数据库文件”的吗???

不使用“事故”也是这样的吗???


另外,还想问一下大师。


为什么“SqlServer”使用“openrowset”可以从“Oracle”数据库中取数据???

这是为什么呢???

[其他解释]
你的每一步操作都先记录到事务日志里面,到checkpoint或者lazywriter的时候才把“已提交”的写入数据文件。也就是说所有东西先进入日志再进入数据文件,如果直接删除,那么里面未写入数据文件的东西就丢失。
[其他解释]
null
[其他解释]
1、纠正一下,是事务,不是事故。
2、所有的数据库操作都是先进入“日志文件”,然后再进入“数据库文件”


3、其实所有操作都在内存中执行,真正访问磁盘的不是你的操作。

这些不容易说清楚,最好找时间精度一下技术内幕系列的书籍。

热点排行