COMMIT后ROLLBACK的问题

cfk0923 2008-01-21 11:51:25
先BeginTransaction,然后commit,如果现在执行ROLLBACK,能不能回到COMMIT之前的状态?怎么才能实现这个功能?
...全文
1378 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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
  • 打赏
  • 举报
回复
问题是你调用的其他方法,是什么方法?
==============================
查询语句,是一个完整的事务,

我刚才看了一下书,知道我这是进行了脏读所以才会出现这个问题的.
加载更多回复(18)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧