读书人

怎的进行“数据回滚”

发布时间: 2012-12-20 09:53:21 作者: rapoo

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

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

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、其实所有操作都在内存中执行,真正访问磁盘的不是你的操作。

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

读书人网 >SQL Server

热点推荐