标题: 多副本的并发控制
mistyme
LU新生
Rank: 1



UID 12509
精华 0
积分 3
帖子 6
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 10
注册 2004-2-20
 
发表于 2004-4-20 14:23  资料  个人空间  短消息  加为好友 
在用主副本法解决多副本的并发控制问题上,如何从多个副本中确定一个主副本,怎样确定一共有多少个副本。若发生故障,如何重新选择一个新的主副本。
现在用delphi中com+组件以及SQLServer2000做这个,构建了客户端,服务器,请问一下中间构建一个协调对象是不是更好???
我也在自学中,各位帮帮忙了。 happy.gif

顶部
avazoo
LU新生
Rank: 1



UID 22029
精华 0
积分 4
帖子 7
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 10
注册 2004-5-30
 
发表于 2004-5-30 16:52  资料  个人空间  短消息  加为好友 
我也想知道 smile.gif

顶部
纳兰婷
LU幼天使
Rank: 2
烟雨朦胧兰亭居主人


UID 9831
精华 0
积分 25
帖子 50
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 20
注册 2004-1-19
 
发表于 2004-6-6 08:18  资料  个人空间  短消息  加为好友 
QUOTE(mistyme @ 2004-04-20 14:23:08)
在用主副本法解决多副本的并发控制问题上,如何从多个副本中确定一个主副本,怎样确定一共有多少个副本。若发生故障,如何重新选择一个新的主副本。
现在用delphi中com+组件以及SQLServer2000做这个,构建了客户端,服务器,请问一下中间构建一个协调对象是不是更好???
我也在自学中,各位帮帮忙了。 happy.gif

sorry,这两天偶较忙的说,才看到你的问题。也不知道这个版的斑竹干什么去了。

如果是使用副本的话,应该是用以锁定为基础的并发控制。你先想一下在集中式数据库开发锁定机构的过程中,是怎么做的。其实已经隐含的假设了每一个数据项目只有一份副本。也就是说一个事务处理只要发现一个数据项目副本处于锁定状态,那么它就可以知道另一个事务处理正在处理该数据项目了。那么再看看分布式数据库,一般都要求存储在不同地点的数据项目之间具有冗余性,那么对存储在不同地点的同一数据项目的两个副本持有冲突锁定的两个事务处理有可能不知道他们的相互存在。在这种情况下,锁定根本没有用。

为了避免这个问题,DTM(分布式事务处理管理程序)必须以以下方法翻译一个由一个主角所提供的、对于一个数据项目的锁定基元:对一个冲突的事务处理来说,不知道这个锁定是不可能的。实现这个要求的最简单的途径是,给存储该数据项目的局部副本的所有地点上的全部 LTM(局部事务处理管理程序)提供局部锁定。这种方法就可以把一个锁定基元变换成和锁定的数据项目的副本数一样多的锁定基元。这种方法很有效,因为两个冲突的事务处理在它们要求锁定的所有地点上将能够发现它们的冲突。而且这种方法是冗余的。

关于确定主副本,你只需要给每一个数据项目的一份副本赋予特权就可以了。但是要注意:必须对它施加所有的锁定。

关于协调程序小组,应该建立这么个程序。
CODE
协调程序: Write "prepare" record in the log;
           Send PREPARE message and activate timeout.

参加者: Wait for PREPARE message;
         if the participant is willing to commit
         then begin
                      write subtransaction's records in the log;
                      write "ready" record in the log;
                      send READY answer message to coordinator
              end
         else begin
                      write "abort" record in the log;
                      send ABORT answer message to coordinator
         end

协调程序: Wait for ANSWER message (READY or ABORT) from all participants or timeout;
           if timeout expired or some answer message is ABORT
           then begin
                       write "global_abort" record in the log;
                       send ABORT command message to all participants
                end
           else (* all answers arrived and were READY *) begin
                        write "global_commit" record in the log;
                        send COMMIT command message to all participants
           end

参加者: wait for command message;
         write "abort" or "commit" record in the log;
         send the ACK message to coordinator;
         execute command

协调程序: wait for ACK messages from all participants;
           write "complete" record in the log





user posted imageuser posted image
顶部
 



当前时区 GMT+8, 现在时间是 2008-8-21 05:58
乐悠LoveUnix论坛-京ICP备05005823号

Thanks to Discuz!  © 2001-2007    Power by LoveUnix.net
Processed in 0.050447 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - 乐悠LoveUnix - Archiver