怎样进行“数据回滚”? 一条数据到数据库的处理流程:1、查询数据配置信息。2、“数据合法性”和“插入数据历史表”并发执行。3、计算“合法”数据的“增量”。4、“插入增量表”、“更新实时数据”、“插入/更新年月日时”表。问题一:如果“数据合法性”后的“插入增量表”、“更新实时数据”、“插入/更新年月日时”表“执行失败了”,但是“插入数据历史表”执行成功了,这是就会造成“数据的不统一”,怎么办?问题二:增量计算出来以后,“更新实时数据”成功了,但是“插入增量表”和“插入/更新年月日时”表失败了,怎么办? 怎么保证各个过程之间的数据完整性?
问题三:在并发处理的情况下,怎样保证数据的完整性?
问题三:在并发处理的情况下,怎样保证数据的完整性?
set @err=0
begin tran
你的数据库语句
select @err=@@error
if @err=0
begin
commit tran
end
else
begin
rollback tran
end
begin transaction
数据操作
If @errno>0
rollback TransAction
else
Commit TransAction
SET XACT_ABORT ON
BEGIN TRANSACTION--执行你的操作COMMIT TRANSACTION
在"Command" 中使用事务,大师有这样的例子可以参考吗??? 如果"Command" 是执行“存储过程”的,那么事务不还是要写在“存储过程”中???
或者 sql语句里写事务控制 在command里执行
有没有类似“SqlCommand”执行事故的实例???
用多线程的话,: “过程1”、“过程2”、“过程3”、“过程4”、“过程5”、“过程6”这样的“6个线程”同时执行,如果6个都成功那么结束,如果有一个不成功,那么执行方法“删除操作的表T1、T2、T3、T4、T5、T6中”的数据。
这样的情况用事故可以吗??? 只能用程序控制吗???
begin tran
--你的SQL语句例如如下id为主键
insert into tra(id,name) select '3','r3'
insert into tra(id,name) select '3','r3'
commit
--建表
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
否则就rollback回滚
问题:1、“SQL执行成功,就commit提交。” , SQL都执行成功了,再“commit”提交,提交什么呢??? 都已经成功了啊。 提交什么呢?
2、“失败就rollback回滚。 ” , SQL是怎么进行的回滚操作? 它是怎样处理的,为什么可以将之前做的操作回滚回去呢?
(
卡号 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 自动取款机
提交到“日志中”才算成功??? SQLServer的日志很重要吗???
在“SQL”中还有“Try Catch”语句啊,它和“事故”结合使用呀。
http://blog.csdn.net/dba_huangzj/article/details/7982945
事故处理,使用“Try catch”
和“设置回滚点”是不同的操作吧。
哦。大师所有的数据库操作都是先进入“日志文件”,然后再进入“数据库文件”的吗???不使用“事故”也是这样的吗???
另外,还想问一下大师。
为什么“SqlServer”使用“openrowset”可以从“Oracle”数据库中取数据???这是为什么呢???