基于跨数据库的事务的一个讨论,希望参考下大家的意见
2011-09-24 19:08
465 查看
多个数据进行数据操作, 基于性能方面的考虑首先排除掉了分布式事务,
后来参考了 ebay 的 用消息队列和消息应用状态表来消除分布式事务 原文可以看这里 http://rdc.taobao.com/blog/cs/?p=671
大致是这样的一个过程:
begin;
INSERT INTO transaction VALUES(xid, $seller_id, $buyer_id, $amount);
put_to_queue “update user(“seller”, $seller_id, amount);
put_to_queue “update user(“buyer”, $buyer_id, amount);
commit;
for each message in queue
begin;
SELECT count(*) as cnt FROM message_applied WHERE msg_id = message.id;
if cnt = 0 then
if message.type = “seller” then
UPDATE user SET amt_sold = amt_sold + message.amount WHERE id = message.user_id;
else
UPDATE user SET amt_bought = amt_bought + message.amount WHERE id = message.user_id;
end
INSERT INTO message_applied VALUES(message.id);
end
commit;
if 上述事务成功
dequeue message
DELETE FROM message_applied WHERE msg_id = message.id;
endend
但是这样子搞 如果 操作A库成功了 而操作B库失败了 我可以在很短时间内重试, 如果重试失败了的话, 我必须对A 库的数据进行手工回滚 , 但是随后提出的另外的一个意见 ,于其如此不如像这样的一个结构
boolean flag = false;
try{
begin;
//dosomething A 库
commit;
flag =true;
}catch(Exception e){
rollback;
}
if(flag){
try{
begin;
//dosomething B 库
commit;
}catch(Exception e){
//手工回滚 A 库
rollback;
}
}
后者似乎更加简单 方便, 前者虽然可以让数据最终达到一致,但是不可避免的是由于数据获取其他的因素必须回滚 前者似乎并没有达到预期的效果.
系统大家讨论下 两种方式的利于弊. 同时也讨论下夸库事务是否有更好的办法
后来参考了 ebay 的 用消息队列和消息应用状态表来消除分布式事务 原文可以看这里 http://rdc.taobao.com/blog/cs/?p=671
大致是这样的一个过程:
begin;
INSERT INTO transaction VALUES(xid, $seller_id, $buyer_id, $amount);
put_to_queue “update user(“seller”, $seller_id, amount);
put_to_queue “update user(“buyer”, $buyer_id, amount);
commit;
for each message in queue
begin;
SELECT count(*) as cnt FROM message_applied WHERE msg_id = message.id;
if cnt = 0 then
if message.type = “seller” then
UPDATE user SET amt_sold = amt_sold + message.amount WHERE id = message.user_id;
else
UPDATE user SET amt_bought = amt_bought + message.amount WHERE id = message.user_id;
end
INSERT INTO message_applied VALUES(message.id);
end
commit;
if 上述事务成功
dequeue message
DELETE FROM message_applied WHERE msg_id = message.id;
endend
但是这样子搞 如果 操作A库成功了 而操作B库失败了 我可以在很短时间内重试, 如果重试失败了的话, 我必须对A 库的数据进行手工回滚 , 但是随后提出的另外的一个意见 ,于其如此不如像这样的一个结构
boolean flag = false;
try{
begin;
//dosomething A 库
commit;
flag =true;
}catch(Exception e){
rollback;
}
if(flag){
try{
begin;
//dosomething B 库
commit;
}catch(Exception e){
//手工回滚 A 库
rollback;
}
}
后者似乎更加简单 方便, 前者虽然可以让数据最终达到一致,但是不可避免的是由于数据获取其他的因素必须回滚 前者似乎并没有达到预期的效果.
系统大家讨论下 两种方式的利于弊. 同时也讨论下夸库事务是否有更好的办法
相关文章推荐
- 一个基于PDO的数据库操作类(新) 一个PDO事务实例
- 自己写了一个Asp.net探针的源码,希望大家讨论一下
- 一个简单的算法题目,搞了半天,希望大家能给点意见
- 发布一个分页算法,希望大家一起讨论,彻底解决分页之苦
- 发一个套接字协议中的tcp案例,希望大家以后可以参考!……
- 一个基于PDO的数据库操作类(新) + 一个PDO事务实例
- 一个让人头疼的数据库问题,大家都来提下解决意见
- 花了差不多一个半小时写了一个基于C++的链表程序,现在发上来,大家多给点意见啊
- 一个关于WebRequest的问题,希望大家能够讨论或指导一下小弟,谢谢
- 一个基于PDO的数据库操作类(新) 一个PDO事务实例
- 一个较完整的连接数据库写法!(请大家参考)
- 一个基于PDO的数据库操作类(新) 一个PDO事务实例
- 今天经理让写一个随机加密的密钥,把思路写出来,作为参考,如果那位在这方面有新的尝试,希望能与大家分享
- 关于数据库的一个统计算法的优化,欢迎大家来讨论(一定要赖心看的)
- 我自己写了一个判断两条多段线重叠的算法。希望大家给点意见或建议。
- 发布一个刚开始着手做的blog系统,希望大家能一起参与进来,共同讨论,共同提高.
- 本人自己写的一个ASP.NET的验证码工具类,以供大家参考。因为本人经验尚浅,如有哪些地方不足或错误,希望大家指出来,不胜感谢!
- 在ASP.NET下做了一个实验MVC的小东西,希望能得到更多的参考意见
- 最近在写一个数据库备份与恢复的框架 希望大家能探讨一下。
- 一个基于PDO的数据库操作类(新) + 一个PDO事务实例