导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

COMMIT后ROLLBACK的问题

cfk0923 2008-01-21 11:51:25
先BeginTransaction,然后commit,如果现在执行ROLLBACK,能不能回到COMMIT之前的状态?怎么才能实现这个功能?
...全文
858 点赞 收藏 38
写回复
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
kele224354 2011-08-10
用什么办法实现的啊,大家帮你忙你却不把成果分享一下。
回复
cfk0923 2008-01-23
自己用其他方法实现功能了,谢谢大家!
回复
cfk0923 2008-01-22
我顶!
回复
cfk0923 2008-01-22
事务嵌套
===========
应该不行吧,因为这样做嵌套层数不确定,因为上传文件行数是不固定的
回复
cfk0923 2008-01-22
我先从上传文件里取值(上传文件是.TXT格式的,可以有多行数据,每一行为一组),然后判断,如果条件都满足,文件上传,数据传到DB中,如果中间有不符合的数据,则文件不上传,并且之前条件满足的数据(比如有二条数据,1满足,2不满足)RollBack,
开始做法是把OPEN 和BEGIN放到WHILE外面,while里是判断和执行SQL语句,最后在while外,判断是否成功,如果成功commit,不成功rollback,但现在有个问题,我在while里判断时,里面调用其它语句(对同一个表select操作,一个完整的事务处理),判断FILED是否在DB中存在,但与之前的OPEN用的是同一个表,这样就会发生TIMEOUT的问题.这是我要完成的功能,TIMEOUT的问题的问题现在的解决方法我把这部分拿到这个WHILE上面去做,在另一个WHILE独立完成,虽然功能可以实现,但是一些细节方面感觉不是很好.还有没有别的方法了,

回复
JiangHongTao 2008-01-22
先BeginTransaction,然后commit,如果现在执行ROLLBACK,能不能回到COMMIT之前的状态?怎么才能实现这个功能?
----------------------------------

不行. 除非用事务嵌套。
回复
wlzd3636 2008-01-22
不能

eg1:


declare @t table(id int,name varchar(50))
begin tran
insert into @t values(1,'aaa')
BEGIN TRAN
insert into @t values(1,'bbb')
SAVE TRAN A
insert into @t values(1,'ccc')
COMMIT TRAN
commit tran
select * from @t

/*

id name
1 aaa
1 bbb
1 ccc
*/



declare @t table(id int,name varchar(50))
begin tran
insert into @t values(1,'aaa')
BEGIN TRAN
insert into @t values(1,'bbb')
SAVE TRAN A
insert into @t values(1,'ccc')
COMMIT TRAN
rollback TRAN A

select * from @t

/*

id name
1 aaa
1 bbb
1 ccc
*/
回复
cfk0923 2008-01-22
人呢
回复
cfk0923 2008-01-22
save tran save_point--设置事务保存点
rollback tran save_point ---回滚到事务保存点

事务保存点怎么用,可以用在像我说的那种情况吗,先在COMMIT前设置一个save_point,然后执行COMMIT,然后如果执行ROLLBACK可以恢复到save_point这里吗?

如果不能,那它的作用是什么呢
回复
cfk0923 2008-01-22
ding
回复
cfk0923 2008-01-21
Begin Transaction
Begin Transaction
Commit
Rollback

这样就可以了。
===========================
这样可以吗?可以针对一个表吗,那你Rollback应该到哪呢,第一个BEGIN和是第二个呢?????????
回复
yesyesyes 2008-01-21
用嵌套事务试试
回复
zefuzhang2008 2008-01-21

create table a(id int,name varchar(200))
go



begin tran a
save tran aa
insert into a(id,name)
select 1,'aaaa'
commit tran a
rollback tran aa


select * from a
回复
luoqun_ncs 2008-01-21
Begin Transaction
Begin Transaction
Commit
Rollback

这样就可以了。
回复
yangjiexi 2008-01-21
不行,commit提交了事务就不能再rollback回滚了
回复
w2jc 2008-01-21
先BeginTransaction,然后commit,如果现在执行ROLLBACK,能不能回到COMMIT之前的状态?
------------
不行
回复
dawugui 2008-01-21
先BeginTransaction,然后commit,如果现在执行ROLLBACK,能不能回到COMMIT之前的状态?怎么才能实现这个功能?

不行.

没法实现这个功能.

只能用log explore打开日志恢复数据.
回复
gahade 2008-01-21
如果在事务上做这样的操作是不可能的.

可以想想其它办法,比如将事务操作写至其它表,这样rollback时可以从其它表来更新.
回复
cfk0923 2008-01-21
obj.CommandText = "Update tbl_1
obj.ExecuteNonQuery();


obj.CommandText = "Insert tbl_1
obj.ExecuteNonQuery();

最后再COMMIT,


这样会不会出错呢,这样如果不出错和"脏读"有什么区别呢?
回复
cfk0923 2008-01-21
问题是你调用的其他方法,是什么方法?
==============================
查询语句,是一个完整的事务,

我刚才看了一下书,知道我这是进行了脏读所以才会出现这个问题的.
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告