发明内容
为了解决相关技术中的问题,本公开实施例提供一种事务处理方法、装置、电子设备及可读存储介质。
第一方面,本公开实施例中提供了一种事务处理方法。
具体地,所述事务处理方法,包括:
通过向第一数据库发起事务的写操作将写入数据写入所述第一数据库;
在第二数据库已完成从所述第一数据库物理复制所述写入数据之后,并且在所述事务被提交之前,向第二数据库发起所述事务的读操作。
结合第一方面,本公开在第一方面的第一种实现方式中,对于所述读操作使用与所述写操作相同的事务标识。
结合第一方面的第一种实现方式,本公开在第一方面的第二种实现方式中,所述事务标识是预先分配的或由所述第一数据库产生的。
结合第一方面的第二种实现方式,本公开在第一方面的第三种实现方式中,所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或
所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前从所述第一数据库发送的;和/或
所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
结合第一方面,本公开在第一方面的第四种实现方式中,所述事务处理方法还包括:
获取所述第一数据库的第一数据库状态信息,所述第一数据库状态信息表明所述写入数据已被写入所述第一数据库;
获取所述第二数据库的第二数据库状态信息;
在所述第一数据库状态信息和所述第二数据库状态信息满足预设条件的情况下,确定所述第二数据库已完成从所述第一数据库物理复制所述写入数据。
结合第一方面的第四种实现方式,本公开在第一方面的第五种实现方式中,所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或
所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前从所述第一数据库发送的;和/或
所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
结合第一方面的第四种实现方式,本公开在第一方面的第六种实现方式中,所述第一数据库是分布式数据库的主库;和/或
所述第二数据库是分布式数据库的从库;和/或
所述状态信息是日志位点;和/或
当日志位点的值随数据库写入操作递增的条件下,所述预设条件是第二数据库日志位点的值大于或者等于在完成向第一数据库写入所述写入数据后获得的第一数据库日志位点的值;和/或
当日志位点的值随数据库写入操作递减的条件下,所述预设条件是第二数据库日志位点的值小于或者等于在完成向第一数据库写入所述写入数据后获得的第一数据库日志位点的值。
第二方面,本公开实施例中提供了一种事务处理方法。
具体地,所述事务处理方法,包括:
响应于事务的写操作,将写入数据写第一数据库;
在将所述写入数据写入所述第一数据库之后并且在提交所述事务之前,将所述写入数据物理复制到第二数据库。
结合第二方面,本公开在第二方面的第一种实现方式中,所述事务处理方法还包括:在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,发送所述事务的事务标识,所述事务标识也用于对所述第二数据库的读操作。
结合第二方面的第一种实现方式,本公开在第二方面的第二种实现方式中,所述事务标识是预先分配的或由所述第一数据库产生的。
结合第二方面的第二种实现方式,本公开在第二方面的第三种实现方式中,所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或
所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
结合第二方面的第一种实现方式,本公开在第二方面的第四种实现方式中,还包括:
在将所述写入数据写入所述第一数据库并且在所述事务被提交之前,发送所述第一数据库的第一数据库状态信息,所述第一数据库状态信息表明所述写入数据已被写入所述第一数据库。
结合第二方面的第四种实现方式,本公开在第二方面的第五种实现方式中,所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或
所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
结合第二方面,本公开在第二方面的第六种实现方式中,所述事务处理方法还包括:
在将所述写入数据物理复制到所述第二数据库之后,发送所述第二数据库的第二数据库状态信息,所述第二数据库状态信息表明所述写入数据已被物理复制到所述第二数据库。
结合第二方面的第六种实现方式,本公开在第二方面的第七种实现方式中,所述事务处理方法还包括:
响应于事务的读操作,从第二数据库读出数据。
结合第二方面和第二方面的第四种实现方式中的任意一种,本公开在第二方面的第八种实现方式中,所述第一数据库是分布式数据库的主库;和/或
所述第二数据库是分布式数据库的从库;和/或
所述状态信息是日志位点。
第三方面,本公开实施例中提供了一种事务处理装置。
具体地,所述事务处理装置,包括:
第一写入模块,用于通过向第一数据库发起事务的写操作来将写入数据写入所述第一数据库;
第一读出模块,用于在第二数据库已完成从所述第一数据库物理复制所述写入数据之后,并且在所述事务被提交之前,向第二数据库发起所述事务的读操作。
结合第三方面,本公开在第三方面的第一种实现方式中,对于所述读操作使用与所述写操作相同的事务标识。
结合第三方面的第一种实现方式,本公开在第三方面的第二种实现方式中,所述事务标识是预先分配的或由所述第一数据库产生的。
结合第三方面的第二种实现方式,本公开在第三方面的第三种实现方式中,所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或
所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前从所述第一数据库发送的;和/或
所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
结合第三方面,本公开在第三方面的第四种实现方式中,所述事务处理装置还包括:
第一状态信息获取模块,用于获取所述第一数据库的第一数据库状态信息,所述第一数据库状态信息表明所述写入数据已被写入所述第一数据库;
第二状态信息获取模块,用于获取所述第二数据库的第二数据库状态信息;
在所述第一数据库状态信息和所述第二数据库状态信息满足预设条件的情况下,确定所述第二数据库已完成从所述第一数据库物理复制所述写入数据。
结合第三方面的第四种实现方式,本公开在第三方面的第五种实现方式中,所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或
所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前从所述第一数据库发送的;和/或
所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
结合第三方面的第四种实现方式,本公开在第三方面的第六种实现方式中,所述第一数据库是分布式数据库的主库;和/或
所述第二数据库是分布式数据库的从库;和/或
所述状态信息是日志位点;和/或
当日志位点的值随数据库写入操作递增的条件下,所述预设条件是第二数据库日志位点的值大于或者等于在完成向第一数据库写入所述写入数据后获得的第一数据库日志位点的值;和/或
当日志位点的值随数据库写入操作递减的条件下,所述预设条件是第二数据库日志位点的值小于或者等于在完成向第一数据库写入所述写入数据后获得的第一数据库日志位点的值。
第四方面,本公开实施例中提供了一种事务处理装置。
具体地,所述事务处理装置,包括:
第二写入模块,用于响应于事务的写操作,将写入数据写第一数据库;
复制模块,用于在将所述写入数据写入所述第一数据库之后并且在提交所述事务之前,将所述写入数据物理复制到第二数据库。
结合第四方面,本公开在第四方面的第一种实现方式中,所述事务处理装置还包括:
事务标识发送模块,用于在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,发送所述事务的事务标识,所述事务标识也用于对所述第二数据库的读操作。
结合第四方面的第一种实现方式,本公开在第四方面的第二种实现方式中,所述事务标识是预先分配的或由所述第一数据库产生的。
结合第四方面的第二种实现方式,本公开在第四方面的第三种实现方式中,所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或
所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
结合第四方面的第一种实现方式,本公开在第四方面的第四种实现方式中,所述事务处理装置还包括:
第一状态信息发送模块,用于在将所述写入数据写入所述第一数据库并且在所述事务被提交之前,发送所述第一数据库的第一数据库状态信息,所述第一数据库状态信息表明所述写入数据已被写入所述第一数据库。
结合第四方面的第四种实现方式,本公开在第四方面的第五种实现方式中,所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或
所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
结合第四方面,本公开在第四方面的第六种实现方式中,所述事务处理装置还包括:
第二状态信息发送模块,用于在将所述写入数据物理复制到所述第二数据库之后,发送所述第二数据库的第二数据库状态信息,所述第二数据库状态信息表明所述写入数据已被物理复制到所述第二数据库。
结合第四方面的第六种实现方式,本公开在第四方面的第七种实现方式中,所述事务处理装置还包括:
第二读出模块,用于响应于事务的读操作,从第二数据库读出数据。
结合第四方面和第四方面的第四种实现方式中的任意一种,本公开在第四方面的第八种实现方式中,所述第一数据库是分布式数据库的主库;和/或
所述第二数据库是分布式数据库的从库;和/或
所述状态信息是日志位点。
第五方面,本公开实施例中提供了一种计算机系统。具体地,所述计算机系统,包括:处理器;存储器,存储有可执行指令,当所述可执行指令被处理器执行时,实现以下方法步骤:
通过向第一数据库发起事务的写操作将写入数据写入所述第一数据库;
在第二数据库已完成从所述第一数据库物理复制所述写入数据之后,并且在所述事务被提交之前,向第二数据库发起所述事务的读操作。
结合第五方面,本公开在第五方面的第一种实现方式中,对于所述读操作使用与所述写操作相同的事务标识。
结合第五方面的第一种实现方式,本公开在第五方面的第二种实现方式中,所述事务标识是预先分配的或由所述第一数据库产生的。
结合第五方面的第二种实现方式,本公开在第五方面的第三种实现方式中,所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或
所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前从所述第一数据库发送的;和/或
所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
结合第五方面,本公开在第五方面的第四种实现方式中,所述事务处理方法还包括:
获取所述第一数据库的第一数据库状态信息,所述第一数据库状态信息表明所述写入数据已被写入所述第一数据库;
获取所述第二数据库的第二数据库状态信息;
在所述第一数据库状态信息和所述第二数据库状态信息满足预设条件的情况下,确定所述第二数据库已完成从所述第一数据库物理复制所述写入数据。
结合第五方面的第四种实现方式,本公开在第五方面的第五种实现方式中,所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或
所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前从所述第一数据库发送的;和/或
所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
结合第五方面的第四种实现方式,本公开在第五方面的第六种实现方式中,所述第一数据库是分布式数据库的主库;和/或
所述第二数据库是分布式数据库的从库;和/或
所述状态信息是日志位点;和/或
当日志位点的值随数据库写入操作递增的条件下,所述预设条件是第二数据库日志位点的值大于或者等于在完成向第一数据库写入所述写入数据后获得的第一数据库日志位点的值;和/或
当日志位点的值随数据库写入操作递减的条件下,所述预设条件是第二数据库日志位点的值小于或者等于在完成向第一数据库写入所述写入数据后获得的第一数据库日志位点的值。
第六方面,本公开实施例中提供了一种计算机系统。具体地,所述计算机系统,包括:处理器;存储器,存储有可执行指令,当所述可执行指令被处理器执行时,实现以下方法步骤:
响应于事务的写操作,将写入数据写第一数据库;
在将所述写入数据写入所述第一数据库之后并且在提交所述事务之前,将所述写入数据物理复制到第二数据库。
结合第六方面,本公开在第六方面的第一种实现方式中,所述事务处理方法还包括:在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,发送所述事务的事务标识,所述事务标识也用于对所述第二数据库的读操作。
结合第六方面的第一种实现方式,本公开在第六方面的第二种实现方式中,所述事务标识是预先分配的或由所述第一数据库产生的。
结合第六方面的第二种实现方式,本公开在第六方面的第三种实现方式中,所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或
所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
结合第六方面的第一种实现方式,本公开在第六方面的第四种实现方式中,还包括:
在将所述写入数据写入所述第一数据库并且在所述事务被提交之前,发送所述第一数据库的第一数据库状态信息,所述第一数据库状态信息表明所述写入数据已被写入所述第一数据库。
结合第六方面的第四种实现方式,本公开在第六方面的第五种实现方式中,所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或
所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
结合第六方面,本公开在第六方面的第六种实现方式中,所述事务处理方法还包括:
在将所述写入数据物理复制到所述第二数据库之后,发送所述第二数据库的第二数据库状态信息,所述第二数据库状态信息表明所述写入数据已被物理复制到所述第二数据库。
结合第六方面的第六种实现方式,本公开在第六方面的第七种实现方式中,所述事务处理方法还包括:
响应于事务的读操作,从第二数据库读出数据。
结合第六方面和第六方面的第四种实现方式中的任意一种,本公开在第六方面的第八种实现方式中,所述第一数据库是分布式数据库的主库;和/或
所述第二数据库是分布式数据库的从库;和/或
所述状态信息是日志位点。
第七方面,本公开实施例中提供了一种计算机可读存储介质。
具体地,所述计算机可读存储介质,存储有可执行指令,当所述可执行指令被处理器执行时,实现如第一方面、第一方面的第一种实现方式到第一方面的第六种实现方式、第二方面、第二方面的第一种实现方式到第二方面的第八种实现方式中任一项所述的方法。
本公开在分布式数据库中采用物理复制的方式,在同一事务中将在第一数据库中写入的数据物理复制到第二数据库,因此读操作可以路由到第二数据库执行,实现了事务内的读写分离,提高了数据库的访问效率。第一数据库是分布式数据库中的主库,第二数据库是分布式数据库中的从库,而且可以是多个从库,提高了读出的效率。事务中的写操作和读操作采用相同的事务标识,事务标识可以由数据库代理预先分配,利于对事务标识的统一管理,也可以由第一数据库在执行写操作之后产生事务标识,则实现了较好的灵活性。当第一数据库状态信息和第二数据库状态信息满足预设条件时,确认完成第一数据库到第二数据库的物理复制,可以进行对第二数据库的读出操作,保证了数据库间的一致性,从而读出正确的结果。
具体实施方式
下文中,将参考附图详细描述本公开的示例性实施方式,以使本领域技术人员可容易地实现它们。此外,为了清楚起见,在附图中省略了与描述示例性实施方式无关的部分。
在本公开中,应理解,诸如“包括”或“具有”等的术语旨在指示本说明书中所公开的特征、数字、步骤、行为、部件、部分或其组合的存在,并且不欲排除一个或多个其他特征、数字、步骤、行为、部件、部分或其组合存在或被添加的可能性。
另外还需要说明的是,在不冲突的情况下,本公开中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本公开。
在提出本公开的过程中,发明人发现,对于主-从架构的数据库可以采用读写分离的方式来提高其性能。具体地,可以向主库写入数据,主库再将写入数据复制到从库,此后就可以从从库读出数据,实现数据库的读写分离,有效避免了主库的读写拥塞。然而,在对主库写入数据时,在事务被提交之前,如果想读取写入数据,则必须将读操作也路由到主库,导致读写分离效果不佳,影响数据库整体性能。
为至少部分解决上述问题而提出本公开。
图1A示出了根据本公开实施例的应用场景的示意图。可以理解,图1所示应用场景仅为了说明本公开的概念和原理,而并非意味着本公开仅适用于这样的应用场景。
如图1A所示,数据库系统包括第一数据库10和第二数据库20,数据库代理30通过向数据库系统发起事务来实现对数据库的读写。事务可以包括读操作和写操作。通过写操作可以将数据写入第一数据库10,第一数据库10将写入数据复制至第二数据库20,然后,数据库代理30可以从第二数据库20读出数据。
图1B示出根据本公开实施例的事务处理方法的流程图。在步骤S101中,通过向第一数据库发起事务的写操作来将写入数据写入所述第一数据库。
在步骤S102中,在第二数据库已完成从所述第一数据库物理复制所述写入数据之后,并且在所述事务被提交之前,向第二数据库发起所述事务的读操作。
其中,所述第二数据库是已完成从所述第一数据库物理复制所述写入数据的数据库,所述物理复制是在所述事务被提交之前开始的。
根据本公开的实施例,图1B所示操作例如可以由图1A中的数据库代理30执行,也可以由其他能够访问第一数据库和第二数据库的其他主体执行。
根据本公开实施例,所述第一数据库是分布式数据库的主库,所述第二数据库是分布式数据库的从库。例如,在读写分离的分布式数据库架构中,第一数据库负责数据写入操作,是分布式数据库的主库;第二数据库负责数据读出操作,是分布式数据库的从库。分布式数据库架构可以包括一个或多个从库。
可以理解,本公开的适用范围不限于上述分布式数据库,而是也适用于其他包括第一数据库和第二数据库的数据库架构。
根据本公开实施例,当同一事务中包含先写后读的两个操作时,写操作和读操作可以分别在第一数据库和第二数据库中完成。首先通过向第一数据库发起事务的写操作来将写入数据写入所述第一数据库,然后向第二数据库发起所述事务的读操作。在传统读写分离架构中,由于从第一数据库到第二数据库的逻辑复制是在事务提交之后完成的,第二数据库在事务提交之前未完成状态更新,因此同一事务中写操作后的读操作也只能路由到第一数据库,使得第一数据库成为读出瓶颈。根据本公开实施例,物理复制在事务被提交之前开始,第二数据库是已完成从第一数据库物理复制所述写入数据的数据库,因此读操作可以路由到第二数据库执行,实现了事务内的读写分离,提高了数据库的访问效率。
根据本公开实施例,对于所述读操作使用与所述写操作相同的事务标识。
根据本公开实施例,在数据库的读提交隔离级别中,如果第二数据库的读操作使用和第一数据库的写操作不同的事务标识,由于不同事务间的隔离,无法在事务提交之前读出复制到第二数据库的写入数据。通过使用与第一数据库的写操作相同的事务标识,可以在事务提交之前,读出由该事务写入第一数据库并复制到第二数据库的写入数据,从而使得本公开的实施例可以适用于数据库的读提交隔离级别。
根据本公开实施例,所述事务标识是预先分配的或由所述第一数据库产生的。
例如,对于所述事务,可以由数据库代理预先为每个事务分配事务标识,也可以由第一数据库在执行写操作之后产生事务标识。由数据库代理预先分配事务标识,可以对事务标识进行统一管理;而由第一数据库在执行写操作之后产生事务标识,则实现了较好的灵活性。
根据本公开实施例,所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前从所述第一数据库发送的;和/或所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
根据本公开实施例,在将所述写入数据写入第一数据库之后,并且在事务被提交之前,第一数据库产生事务标识。在同一事务中,当存在多次读、写操作时,可以只在第一次写操作时产生事务标识,而其他读写操作则不产生事务标识。由于写操作是针对第一数据库进行的,因此,可以由第一数据库在完成所述写入数据的写入之后产生事务标识。例如,也可以由数据库代理在发起事务时产生事务标识,并且对该事务中的读写操作均使用该事务标识。
根据本公开的实施例,在由第一数据库产生事务标识的情况下,在将写入数据写入第一数据库之后,并且在事务被提交之前,第一数据库将事务标识发送给数据库代理,数据库代理后续将事务标识应用于对第二数据库的读操作。
根据本公开的实施例,第一数据库在完成写操作之后,会产生写操作的返回结果,用于记录写操作的完成状态。写操作的返回结果可以和事务标识一起发送到数据库代理,也可以分别发送到数据库代理。
图1C示出根据本公开实施例的事务处理方法的流程图。
图1C除了包括与图1B相同的步骤S101和S102之外,还增加了步骤S103~S105。
在步骤S103中,获取所述第一数据库的第一数据库状态信息,所述第一数据库状态信息表明所述写入数据已被写入所述第一数据库。
在步骤S104中,获取所述第二数据库的第二数据库状态信息。
在步骤S105中,在所述第一数据库状态信息和所述第二数据库状态信息满足预设条件的情况下,确定所述第二数据库已完成从所述第一数据库物理复制所述写入数据。
需要注意的是,虽然图中示出步骤S103在步骤S104之前,但这两个步骤的顺序可以调换,即步骤S104可以在步骤S103之前执行,或者这两个步骤可以并行执行。
根据本公开实施例,在将写入信息写入第一数据库后,第一数据库状态信息会发生更新。当写入数据从第一数据库物理复制到第二数据库后,第二数据库状态信息也会发生更新。当数据库代理向第二数据库发起所述事务的读操作时,可以获取第一数据库的第一数据库状态信息和第二数据库的第二数据库状态信息,并且确认第一数据库状态信息和第二数据库状态信息满足预设条件,即确认写入到第一数据库的数据完成到第二数据库的物理复制,此时才能从第二数据库读出有效数据。
根据本公开实施例,第一数据库状态信息可以是随第一数据库的更新而相应递增的数值(例如数值随第一数据库的更新而相应递增的日志位点),第二数据库状态信息可以是随第二数据库的更新时而相应递增的数值(例如数值随第二数据库的更新而相应递增的日志位点)。在此情况下,预设条件可以是第二数据库状态信息的值大于或者等于在完成向第一数据库写入所述写入数据后获得的第一数据库状态信息的值。可以理解,也可以采用其他方式来设置第一数据库状态信息、第二数据库状态信息、预设条件,只要能够判断第二数据库已完成从第一数据库的物理复制即可。
根据本公开实施例,所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前从所述第一数据库发送的;和/或所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
根据本公开实施例,在将所述写入数据写入所述第一数据库之后并且在事务提交之前产生并向数据库代理发送第一数据库状态信息,可以使数据库代理确认第一数据库的写入操作已经完成,便于开始同一事务中后续可能的读出操作。写操作的返回结果可以和第一数据库状态信息一起发送,也可以分别发送。
根据本公开实施例,所述第一数据库是分布式数据库的主库;和/或所述第二数据库是分布式数据库的从库;和/或所述状态信息是日志位点;和/或当日志位点的值随数据库写入操作递增的条件下,所述预设条件是第二数据库日志位点的值大于或者等于在完成向第一数据库写入所述写入数据后获得的第一数据库日志位点的值;和/或当日志位点的值随数据库写入操作递减的条件下,所述预设条件是第二数据库日志位点的值小于或者等于在完成向第一数据库写入所述写入数据后获得的第一数据库日志位点的值。
根据本公开实施例,第一数据库可以是分布式数据库的主库,用于完成分布式数据库的写入操作;第二数据库可以是分布式数据库的从库,并且可以是多个从库,用于完成分布式数据库的读出操作。
根据本公开实施例,可以采用日志位点实现所述状态信息。所述预设条件是用于判断第一数据库到第二数据库的物理复制已经完成。当日志位点的值随数据库写入操作而递增时,可以将预设条件设定为第二数据库日志位点的值大于或者等于在完成向第一数据库写入所述写入数据后获得的第一数据库日志位点的值,此时可以判断第一数据库到第二数据库的物理复制已经完成。当日志位点的值随数据库写入操作而递减时,可以将预设条件设定为第二数据库日志位点的值小于或者等于在完成向第一数据库写入所述写入数据后获得的第一数据库日志位点的值,此时可以判断第一数据库到第二数据库的物理复制已经完成。
图2示出根据本公开实施例的事务处理方法的流程图。
如图2所示,根据本公开实施例的事务处理方法包括步骤S201和步骤S202。在步骤S201中,响应于事务的写操作,将写入数据写第一数据库。
在步骤S202中,在将所述写入数据写入所述第一数据库之后并且在提交所述事务之前,将所述写入数据物理复制到第二数据库。
根据本公开的实施例,图2所示操作例如可以由图1A中的第一数据库100执行,也可以由其他数据库架构中的数据库执行。或者,图2所示操作可以由包括多个数据库的数据库系统来执行。
根据本公开实施例,响应于数据库代理的事务的写操作,将写入数据写第一数据库。在将写入数据写入第一数据库之后并且在提交所述事务之前,将写入数据物理复制到第二数据库。物理复制是为事务中写操作之后可能的读操作服务的。
在传统读写分离架构中,由于从第一数据库到第二数据库的逻辑复制是在事务提交之后完成的,第二数据库在事务提交之前未完成状态更新,因此同一实务中写操作后的读操作也只能路由到第一数据库,使得第一数据库成为读出瓶颈。根据本公开实施例,所述物理复制在所述事务被提交之前开始,所述第二数据库是已完成从所述第一数据库物理复制所述写入数据的数据库,因此读操作可以路由到所述第二数据库执行,实现了事务内的读写分离,提高了数据库的访问效率。
根据本公开实施例,在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,发送所述事务的事务标识,所述事务标识也用于对所述第二数据库的读操作。例如,事务标识可以由第一数据库产生并发送,该事务标识可以用于所述事务的读操作。根据本公开实施例,在数据库的读提交隔离级别中,如果第二数据库的读操作使用和第一数据库的写操作不同的事务标识,由于不同事务间的隔离,无法在事务提交之前读出复制到第二数据库的写入数据。通过使用与第一数据库的写操作相同的事务标识,可以在事务提交之前,读出由该事务写入第一数据库并复制到第二数据库的写入数据,从而使得本公开的实施例可以适用于数据库的读提交隔离级别。
根据本公开实施例,所述事务标识是预先分配的或由所述第一数据库产生的。
例如,对于所述事务,可以由数据库代理预先为每个事务分配事务标识,也可以由第一数据库在执行写操作之后产生事务标识。由数据库代理预先分配事务标识,可以对事务标识进行统一管理;二由第一数据库在执行写操作之后产生事务标识,则实现了较好的灵活性。
根据本公开实施例,所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
根据本公开实施例,在将写入数据写入第一数据库之后,并且在事务被提交之前,第一数据库产生事务标识。在同一事务中,当存在多次读、写操作时,可以只在第一次写操作时产生事务标识,而其他读写操作则不产生事务标识。由于写操作是针对第一数据库进行的,因此,可以由第一数据库在完成所述写入数据的写入之后产生事务标识。写操作会产生返回结果,记录写操作的完成情况。在写操作完成之后事务被提交之前,写操作的返回结果可以和事务标识一起从第一数据库发送到数据库代理,也可以分别从第一数据库发送到数据库代理。
根据本公开实施例,在将所述写入数据写入所述第一数据库并且在所述事务被提交之前,发送所述第一数据库的第一数据库状态信息,所述第一数据库状态信息表明所述写入数据已被写入所述第一数据库。例如,第一数据库状态信息可以由第一数据库产生并发送,用于表示第一数据库已完成对所述写入数据的写入。根据本公开实施例,在将所述写入数据写入所述第一数据库并且在所述事务被提交之前,产生第一数据库状态信息,表示写入操作已经完成。第一数据库将状态信息发送至数据库代理,向数据库代理通知完成写入操作。
所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。例如,在写入数据写入第一数据库之后,而且在事务被提交之前产生第一数据库的状态信息。第一数据库在完成写操作之后,会产生写操作的返回结果,用于记录写操作的完成状态。在写入数据写入第一数据库之后,而且在事务被提交之前,写操作的返回结果可以和第一数据库的状态信息一起发送到数据库代理,也可以分别发送到数据库代理。第一数据库状态信息和写操作的返回结果在事务提交之前发送,以利于在后续事务可能的读操作中使用第一数据库状态信息,实现同一事务中的读写分离。
根据本公开实施例,在将所述写入数据物理复制到所述第二数据库之后,发送所述第二数据库的第二数据库状态信息,所述第二数据库状态信息表明所述写入数据已被物理复制到所述第二数据库。例如,第二数据库状态信息可以是由第二数据库产生并发送的,当第二数据库确认自身已经物理复制了全部写入数据时,可以产生并发送第二数据库状态信息。或者,第二数据库状态信息也可以是由第一数据库产生并发送的,当第一数据库确认第二数据库已经物理复制了全部写入数据时,可以产生并发送第二数据库状态信息。根据本公开实施例,可以将第二数据库状态信息发送到数据库代理,表明第二数据库已完成从第一数据库复制写入数据,从而数据库代理可以使用该第二数据库执行同一事务中后续可能的读出操作。
根据本公开实施例,响应于事务的读操作,从第二数据库读出数据。
根据本公开实施例,例如,数据库代理比较第一数据库状态信息和第二数据库状态信息,当第一数据库状态信息和第二数据库状态信息满足预设条件时,例如当第一数据库状态信息和第二数据库状态信息表明第一数据库已完成所述写入数据的写入,第二数据库已完成从第一数据库物理复制写入数据时,数据库代理可以向第二数据库发起事务中的读操作,响应于事务的读操作,从第二数据库读出数据。
根据本公开实施例,所述第一数据库是分布式数据库的主库;和/或所述第二数据库是分布式数据库的从库;和/或所述状态信息是日志位点。例如,在读写分离的分布式数据库架构中,第一数据库负责数据写入操作,是分布式数据库的主库;第二数据库负责数据读出操作,是分布式数据库的从库。从库可以是一个,也可以是多个。状态信息是日志位点,也可以用其它方式实现。上述事务处理方法可以对数据库的读提交隔离级别有效。
图3示出根据本公开实施例的事务处理方法的整体流程图。
在步骤S301中,应用程序向数据库代理发出包括写、读操作的事务请求。
在步骤S302中,数据库代理向第一数据库发起写操作。
写入数据写入第一数据库后,第一数据库产生事务标识和更新后的第一数据库状态信息。
在步骤S303中,在写入数据写入第一数据库后,在事务提交前,将写入数据物理复制到第二数据库。
第二数据库完成物理复制后,产生更新后的第二数据库状态信息。
在步骤S304中,第一数据库向数据库代理发送事务标识、更新后的第一数据库状态信息、和写操作的返回结果。
在步骤S305中,数据库代理将写操作结果返回应用程序。
在步骤S306中,数据库代理向第二数据库发送事务标识。
在步骤S307中,数据库代理从第二数据库获取更新后的第二数据库状态信息,当第二数据库状态信息和第一数据库状态信息表明第一数据库已完成写入数据的写入且第二数据库已完成从第一数据库物理复制写入数据时,数据库代理从第二数据库读取数据。
根据本公开实施例,第一数据库可以是分布式数据库中的主库,第二数据库可以是分布式数据库中的从库,第一数据库状态信息可以是主库日志位点,第二数据库状态信息可以是从库日志位点。
图4示出根据本公开实施例的基于日志位点的读写流程图。
图4示出了应用程序、数据库代理、主库和多个从库,例如从库1和从库2。
如图4所示,应用程序向数据库代理发起包括写操作和读操作的事务后,数据库代理向主库写入数据。此次写入操作产生的日志位点值为30,由主库发往数据库代理。主库向从库1和从库2发起物理复制。后续主库执行其它写入操作,更新当前日志位点值至35。数据库代理执行读操作时,从从库1和从库2获取当前日志位点值。从库1已完成上述物理复制,并完成了其它复制,当前日志位点值为31;从库2未完成物理复制,当前日志位点值为29。由于从库1的当前日志位点值大于30,而从库2的当前日志位点值小于30,因此数据库代理在从库1执行读操作。
图5示出根据本公开实施例的事务处理装置的框图。
如图5所示,事务处理装置300包括:第一写入模块301,用于通过向第一数据库发起事务的写操作来将写入数据写入所述第一数据库;第一读出模块302,用于在第二数据库已完成从所述第一数据库物理复制所述写入数据之后,并且在所述事务被提交之前,向第二数据库发起所述事务的读操作。其中,所述第二数据库是已完成从所述第一数据库物理复制所述写入数据的数据库,所述物理复制是在所述事务被提交之前开始的。
根据本公开实施例,对于所述读操作使用与所述写操作相同的事务标识。
根据本公开实施例,所述事务标识是预先分配的或由所述第一数据库产生的。
根据本公开实施例,所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前从所述第一数据库发送的;和/或所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
图6示出根据本公开实施例的事务处理装置的框图。
图6包括与图5相同的模块301和302,还包括附加模块:
第一状态信息获取模块303,用于获取所述第一数据库的第一数据库状态信息,所述第一数据库状态信息表明所述写入数据已被写入所述第一数据库;第二状态信息获取模块304,用于获取所述第二数据库的第二数据库状态信息。在所述第一数据库状态信息和所述第二数据库状态信息满足预设条件的情况下,确定所述第二数据库已完成从所述第一数据库物理复制所述写入数据。
根据本公开实施例,所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前从所述第一数据库发送的;和/或所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
根据本公开实施例,所述第一数据库是分布式数据库的主库;和/或所述第二数据库是分布式数据库的从库;和/或所述状态信息是日志位点;和/或当日志位点的值随数据库写入操作递增的条件下,所述预设条件是第二数据库日志位点的值大于或者等于在完成向第一数据库写入所述写入数据后获得的第一数据库日志位点的值;和/或当日志位点的值随数据库写入操作递减的条件下,所述预设条件是第二数据库日志位点的值小于或者等于在完成向第一数据库写入所述写入数据后获得的第一数据库日志位点的值。
图7示出根据本公开实施例的事务处理装置的框图。
如图7所示,所述事务处理装置400包括:
第二写入模块401,用于响应于事务的写操作,将写入数据写第一数据库;复制模块402,用于在将所述写入数据写入所述第一数据库之后并且在提交所述事务之前,将所述写入数据物理复制到第二数据库。
图8示出根据本公开实施例的事务处理装置的框图。
图8包括和图7相同的模块401和402,还包括以下附加模块中的一个或者多个。
事务标识发送模块403,用于在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,发送所述事务的事务标识,所述事务标识也用于对所述第二数据库的读操作。
第一状态信息发送模块404,用于在将所述写入数据写入所述第一数据库并且在所述事务被提交之前,发送所述第一数据库的第一数据库状态信息,所述第一数据库状态信息表明所述写入数据已被写入所述第一数据库。
第二状态信息发送模块405,用于所述写入数据物理复制到所述第二数据库之后,发送第二数据库的第二数据库状态信息,所述第二数据库状态信息表明所述写入数据已被物理复制到所述第二数据库。
第二读出模块406,用于响应于事务的读操作,从第二数据库读出数据。
根据本公开实施例,所述事务标识是预先分配的或由所述第一数据库产生的。
根据本公开实施例,所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
根据本公开实施例,所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
根据本公开实施例,所述第一数据库是分布式数据库的主库;和/或所述第二数据库是分布式数据库的从库;和/或所述状态信息是日志位点。
图9示出根据本公开实施例的计算机系统的结构框图。
如图9中所示,该计算机系统900可以包括一个或多个处理器901以及一个或多个存储器902。所述一个或多个存储器902用于存储一条或多条可执行指令,当所述可执行指令被所述一个或多个处理器901执行时,可以实现以下方法步骤:
通过向第一数据库发起事务的写操作将写入数据写入所述第一数据库;在第二数据库已完成从所述第一数据库物理复制所述写入数据之后,并且在所述事务被提交之前,向第二数据库发起所述事务的读操作。
根据本公开实施例,对于所述读操作使用与所述写操作相同的事务标识。
根据本公开实施例,所述事务标识是预先分配的或由所述第一数据库产生的。
根据本公开实施例,所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前从所述第一数据库发送的;和/或所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
根据本公开实施例,所述方法步骤还包括:获取所述第一数据库的第一数据库状态信息,所述第一数据库状态信息表明所述写入数据已被写入所述第一数据库;获取所述第二数据库的第二数据库状态信息;在所述第一数据库状态信息和所述第二数据库状态信息满足预设条件的情况下,确定所述第二数据库已完成从所述第一数据库物理复制所述写入数据。
根据本公开实施例,所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前从所述第一数据库发送的;和/或所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
根据本公开实施例,所述第一数据库是分布式数据库的主库;和/或所述第二数据库是分布式数据库的从库;和/或所述状态信息是日志位点;和/或当日志位点的值随数据库写入操作递增的条件下,所述预设条件是第二数据库日志位点的值大于或者等于在完成向第一数据库写入所述写入数据后获得的第一数据库日志位点的值;和/或当日志位点的值随数据库写入操作递减的条件下,所述预设条件是第二数据库日志位点的值小于或者等于在完成向第一数据库写入所述写入数据后获得的第一数据库日志位点的值。
根据本公开实施例,所述一个或多个存储器902用于存储一条或多条可执行指令,当所述可执行指令被所述一个或多个处理器901执行时,可以实现以下方法步骤:
响应于事务的写操作,将写入数据写第一数据库;在将所述写入数据写入所述第一数据库之后并且在提交所述事务之前,将所述写入数据物理复制到第二数据库。
根据本公开实施例,所述方法步骤还包括:在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,发送所述事务的事务标识,所述事务标识也用于对所述第二数据库的读操作。
根据本公开实施例,所述事务标识是预先分配的或由所述第一数据库产生的。
根据本公开实施例,所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或所述事务标识是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
根据本公开实施例,所述方法步骤还包括:在将所述写入数据写入所述第一数据库并且在所述事务被提交之前,发送所述第一数据库的第一数据库状态信息,所述第一数据库状态信息表明所述写入数据已被写入所述第一数据库。
根据本公开实施例,所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前产生的;和/或所述第一数据库状态信息是在将所述写入数据写入所述第一数据库之后并且在所述事务被提交之前,与所述写操作的返回结果一起从所述第一数据库发送的。
根据本公开实施例,所述方法步骤还包括:在将所述写入数据物理复制到所述第二数据库之后,发送所述第二数据库的第二数据库状态信息,所述第二数据库状态信息表明所述写入数据已被物理复制到所述第二数据库。
根据本公开实施例,所述方法步骤还包括:响应于事务的读操作,从第二数据库读出数据。
根据本公开实施例,所述第一数据库是分布式数据库的主库;和/或所述第二数据库是分布式数据库的从库;和/或所述状态信息是日志位点。
根据本公开实施例,上述事务处理方法是在分布式数据库系统中实现的。该分布式数据库系统可以使用多台计算机实现。
图10示出根据本公开实施例适于用来实现用于事务处理方法的计算机体系架构的结构框图。
如图10所示,计算机系统1000包括处理器(CPU)1001,其可以根据存储在只读存储器(ROM)1002中的程序或者从存储部分1008加载到随机访问存储器(RAM)1003中的程序而执行上述方法。在RAM 1003中,还存储有系统1000操作所需的各种程序和数据。CPU 1001、ROM 1002以及RAM 1003通过总线1004彼此相连。输入/输出(I/O)接口1005也连接至总线1004。
以下部件连接至I/O接口1005:包括键盘、鼠标等的输入部分1006;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分1007;包括硬盘等的存储部分1008;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分1009。通信部分1009经由诸如因特网的网络执行通信处理。驱动器1010也根据需要连接至I/O接口1005。可拆卸介质1011,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1010上,以便于从其上读出的计算机程序根据需要被安装入存储部分1008。
另外,根据本公开的实施方式,上文描述的方法可以被实现为计算机软件程序。例如,本公开的实施方式包括一种计算机程序产品,其包括有形地包含在及其可读介质上的计算机程序,所述计算机程序包含用于执行上述方法的程序代码。在这样的实施方式中,该计算机程序可以通过通信部分1009从网络上被下载和安装,和/或从可拆卸介质1011被安装。
根据本公开的实施例,可以采用一个如上文描述的计算机体系架构来实现根据本公开实施例的方法,也可以采用多个如上文描述的计算机体系架构彼此协作来实现根据本公开实施例的方法。
附图中的流程图和框图,图示了按照本公开各种实施方式的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本公开实施方式中所涉及到的单元或模块可以通过软件的方式实现,也可以通过可编程硬件的方式来实现。所描述的单元或模块也可以设置在处理器中,这些单元或模块的名称在某种情况下并不构成对该单元或模块本身的限定。
作为另一方面,本公开还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施方式中所述装置中所包含的计算机可读存储介质;也可以是单独存在,未装配入设备中的计算机可读存储介质。计算机可读存储介质存储有一个或者一个以上程序,所述程序被一个或者一个以上的处理器用来执行描述于本公开的方法。
以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离所述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。