如何回滚已经提交成功的事务? ( 积分: 100 )

  • 主题发起人 主题发起人 michael.ma
  • 开始时间 开始时间
M

michael.ma

Unregistered / Unconfirmed
GUEST, unregistred user!
要把数据插入两个不同的sybase数据库,如果一个失败,则另一个成功的也要回滚。但事物成功提交后回滚不了拉。请问有没有什么好的办法实现数据库同步啊?
 
要把数据插入两个不同的sybase数据库,如果一个失败,则另一个成功的也要回滚。但事物成功提交后回滚不了拉。请问有没有什么好的办法实现数据库同步啊?
 
sybase没用过,sql Server用分布式事务
 
应该类似吧,sql server怎样的?
还有,数据库复制功能行吗?
 
有sqlserver的话翻翻帮助,找分布式事务。

示例
本例在本地和远程数据库上更新作者的姓。本地和远程数据库将同时提交或同时回滚本事务。



说明 除非正在运行 Microsoft® SQL Server™ 的计算机上当前装有 MS DTC,否则本例会产生错误信息。关于安装 MS DTC 的更多信息,请参见 Microsoft 分布式事务处理协调器文档。


USE pubs
GO
BEGIN DISTRIBUTED TRANSACTION
UPDATE authors
SET au_lname = 'McDonald' WHERE au_id = '409-56-7008'
EXECUTE remote.pubs.dbo.changeauth_lname '409-56-7008','McDonald'
COMMIT TRAN
GO
 
Db1,Db2连两个数据库。
try
Db1.StartTransaction;
Db2.StartTransaction;
//SQL语句 (可以多条,每条在数据库执行)
...
//提交
Db1.commit;
Db2.commit;
except
if Db1.InTransaction then
Db1.rollback;
if Db2.InTransaction then
Db2.rollback;
end;
基本同时提交,做到尽量同步。
(我用的是Oracle)
我想sybase应该类似吧。
 
Db1.commit;成功
Db2.commit;失败
怎么办?db1会回滚么?
 
楼主的问题是个典型的两阶段提交问题,关于这个问题有标准的解决方案。
楼主用“两阶段提交”或者“X/Open”去搜索,应该可以找到理想的答案。
 
随便想一下!
能否在一个语句中同时插入到两个数据库?
 
你每一条SQL语句都执行了!如果有错就会回滚了。
到了Commit的时候基本不会出错的!如果Db1.commit;成功了,这时出现了意外情况,
Db2.commit;失败,Db1是不会回滚的。
只要是操作两个数据库,会有千万分之一的机会的出现这样的情况。
那你在程序上已经没有太大的优化了!只能从硬件去完善了、
 
to piggoal,
你每一条SQL语句都执行了,commit还是可能出错。比如多个用户同时修改某记录时。
又比如db1.commit执行完后机器断电呢?你永远不能预料到会有什么情况发生。
还是用分布式事务吧
 
分布式事务,我没用过!
做事务时,多个用户同时修改某记录?我们一定要用到锁表(表中办一个字段LOCK)才行,不然会出现很多死锁。只要有用户对表进行修改,删除时都要锁表,锁表后其它用户不能对表进行操作。
db1.commit执行后机器断电?不是说,从硬件去完善了吗?
做两件事,总有个先后,谁能保证数据库就一定不会断电呢?
 
多人接受答案了。
 
后退
顶部