一种创建支持mpp数据库中的可重读隔离级别的分布式事务管理器的系统和方法_3

文档序号:9916923阅读:来源:国知局
然后,所述方法300返回至上述方法200中对应的后续步骤。
[0035]图4示出了使用包括隐性子事务的两阶段协议的方法400的实施例,所述方法400可以在MPP数据库系统的任意节点上执行。首先,第一节点NI包括非共享数据A,第二节点N2包括非共享数据B。将客户端连接发送至所述第一节点NI,开始包括事务ID 200的显性事务txnl。在步骤1-001中,开始命令发起所述事务。Txnl是父事务,所述第一节点NI作为TM。在这个示例中,所述父事务参与修改和存取数据A和数据B。所述第一节点NI通过将节点的逻辑名称附加到事务ID上的方式为所述事务生成全局ID(global ID,GID)。例如,所述全局ID为将第一节点名NI添加到所述事务ID 200中得到的Tnode-nl-200。保证所述GID在集群中是唯一的。当所述节点确定所述事务涉及多个节点时,所述第一节点NI生成所述全局ID。作为此协议的一部分,所述父事务发现参与所述事务的所有节点,从所述所有节点收集本地快照,计算出协调快照。在步骤1-002中,执行在本地写入数据的ffrite(A)命令。在所述第一节点NI上的txnl上下文中执行操作或者fcite(A)命令。在步骤1-003中,执行对所述第二节点N2上的数据B进行的写操作ffrite(B)。对于该操作,使用从所述第一节点NI上获取的所述协调快照在所述第二节点N2上开始包括本地事务ID 102的隐性事务txn2。所述事务txn2是txnl的子事务。然后,在步骤1-004中,执行Read(A),所述Read(A)是对本地数据A进行的读操作。Read(A)是在所述第一节点NI上的本地事务的上下文txnl中执行的。在步骤1-005中,对数据B执行ffrite(B)操作,在步骤1-006中,对数据B执行Read(B)操作。这两个操作都是在已经开启的事务txn2中在所述第二节点N2上执行的。
[0036]然后,所述客户端显性地发出提交命令。所述第一节点NI意识到自己作为TM,提交操作自动被所述第一节点NI转化为两阶段提交(two phase commit,2PC)协议。当子事务开启时,将所述全局ID和建立子事务的请求一起发送至其他节点。至此,使用全局IDTnode-nl-200在2PC的第一阶段准备了事务txnl和txn2。最后,合并响应,所述第一节点NI发起提交的第二阶段。
[0037]图5示出了在参与的节点上事务的所有子事务中生成和维护GID的方法500的实施例。所述GID唯一地标识节点集群中每一个事务,将事务的所有独立单元结合成一个逻辑单元。在传统的事务管理器中,每一个单一的事务都由一个唯一的ID标识。在所述方法500中,每一个事务被标识为主事务ID和本地事务ID的事务对。所述主事务ID由父事务分配,所述本地事务ID是本地事务管理器分配的事务ID。如上所述,所述主事务ID是通过将节点号附加到所述本地事务ID的方式生成的GID。这保证了主事务ID在所述集群中是全局唯一的。
[0038]在所述方法500中,通过客户端连接在第一节点N5上显性地开始事务。因此,所述第一节点N5是TM,给其分配本地事务ID,例如,6364。自动生成的全局事务ID为5:6364,这是通过将节点号“5”附加到所述本地事务ID 6364上的方式创建的。在步骤2-001中,所述节点N5为所有其他节点计算协调快照,其中,所述所有其他节点在本示例中是N8和N12。将所述协调快照发送回所述其他节点(NS和N12)。随后,所述协调快照用于在所述3个节点的每一个上执行单独的事务。在步骤2-002中,在〈5:6364,6364>上下文中执行节点N5上的本地写操作,g卩,Write(N5)命令。在步骤2-003中,ffrite(N8)为在第二节点N8上进行的远端操作。相应地,在所述节点NS上开启隐性事务,为所述节点NS的本地事务管理器分配本地事务ID8876 ο这个新事务是所述父事务的子事务,从所述父事务处获得主事务ID。在本示例中,所述主事务ID为5:6364。因此,所述远端操作在〈5:6364,8876〉上下文中执行。
[0039]在步骤2-004中,在第三节点N12上执行的远端事务为Write(N12)操作。因此,在所述节点N12上开启了新的子事务,所述新的子事务获得与父事务相同的主事务ID: 5:6364。该主事务ID,此处也称为全局事务ID,与所述节点N12的本地事务ID 4387形成了对。因此,所述ffrite(N12)操作在〈5:6364,4387〉上下文中执行。在步骤2-005中,提交操作部署隐性2PC协议,以在所有3个节点(N5、N8和N12)上进行提交。所述父事务6364在节点N5上提交,子事务8876在节点N8上提交,子事务4387在节点N12上提交。虽然父事务及其子事务是在各个节点上作为独立的事务执行,但是通过为所有的事务分配一对ID,将所述事务识别为同一个全局事务的一部分,其中,主事务ID或全局事务ID是所有的事务对共有的。
[0040]在分布式环境中,可以在一个节点上执行事务的单一语句,例如,“select collfrom table where coll = data-on-local_node”。或者,可以在不止一个节点上执行单一语句,例如,“select coll from table where TRUE”。图6示出了方法600的实施例,其中,事务中的每个查询都可以在单节点本地完整地执行。例如,选择、更新、插入以及删除操作中的任意一个仅涉及一个节点,而不是多个节点。快照是任意时刻活跃事务的列表,TM使用快照保证合适的隔离等级。所述快照有助于对当前事务隐藏其他当前活跃事务的中间状态。例如,每一个节点使用本地事务ID维护其快照,利用额外的元数据为每个本地事务ID识别对应的主事务ID或全局事务ID。
[0041 ] 在步骤3-001中,在第一节点NI上开始带有本地事务ID 100的事务txnl。在步骤3_002中,分析所述事务的语句,查找所述事务需要的所有节点。这可以通过在语句中使用的各种数据库对象(例如,表和/或分区)名实现。在其他方案中,查询内部维护的数据库目录,获知所述节点,其中,存在对应的数据库对象。例如,所述目录中包括如下信息:表Tl只存在于节点NI上,表T2只存在于节点N2上,表T3存在于NI和N2上。在某些情况下,所述语句查询中使用的谓语用于查找所述节点。例如,可以假设基于某一列的值是偶数还是奇数,将表Tl分为两部分。例如,因为列Co I的值是奇数,如SELECT*FR0M TI WHERE COL = 5的查询将只需要在节点N2上运行。另一方面,如果所述查询是SELECT*FR0M TlffHERE C0L>5,则查询分析器会识别出节点NI和N2都是本事务所需的。
[0042]一旦查找到可能参与所述事务的节点的列表,在步骤3-003中,计算全局快照,带有所述全局快照的事务语句应该在可重读隔离级别的对应节点上执行。该快照是所有参与的节点上所有活跃事务的列表,用全局/主格式表示,即,node ID: local_transact1n_number。所述节点NI获得快照<S1>122,130,且认为带有ID 122和130的事务当前运行在所述节点NI上。被这些事务修改的任何数据都不能对所述事务txnI可视。类似的,所述节点NI请求所述节点N2发送其本地快照,接收<S2>372。然后,计算协调快照,其中,所述协调快照规定了参与这个事务的所有节点中的活跃事务的列表。下面解释计算协调全局快照的细节。进一步地,当在各自节点上开始本地事务时,每个节点将全局快照转化为其本地格式。在步骤3-003中,Read(A)操作与本地计算的协调快照一起运行,以确保可重读隔离。下一个步骤3-005中,ffrite(B)操作在所述节点N2上发起远端事务txn2(ID 400),将查询语句和所述协调快照转发到所述节点N2上。所述事务txn2保证了在所述节点N2上运行的语句的可重读隔离。最后,提交操作部署隐性2PC协议,以在所述节点NI和N2上进行提交。
[0043]图7示出了不一
当前第3页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1