一个非侵入的Go事务管理库——如何使用

在文章"清晰架构(Clean Architecture)的Go微服务: 事物管理"中,我谈到了如何在清晰架构中实现非侵入的事务管理。

它允许你把事务代码与业务逻辑代码分开,并且让你在编写业务逻辑时不必考虑事务。但它也有一些缺点。首先,它是整个清晰框架(Clean Architecture)的一部分,所以你不能抛开框架单独使用它。其次,尽管它对业务逻辑没有侵入,但它对框架有侵入。你需要修改框架的各个层,使其工作,这使他看起来比较复杂。 第三,正如我在文章中提到的,它存在一个依赖泄漏的漏洞。我虽然在文章中指出了解决方案,但它是一个比较大的改动,因此我当时就把它先放下了。现在,我终于有时间重新拾起它,并做了重要改进,结果令人非常满意。

项目需求

以下是新的项目需求:

  1. 把事务管理代码写成一个单独的第三方库,这样人们就可以在任何框架中使用它。
  2. 使其对框架无侵入,这意味着除了在用例层之外,在清晰架构的任何层中都没有事务代码。几乎所有的事务代码都在第三方的事务库中。
  3. 修复以前设计中的依赖泄漏。

最终,我完成了所有的目标,结果出乎意料的好。我将写两篇文章来描述它,这篇文章讨论如何使用这个第三方库,下一篇文章讨论事务管理库的工作原理。当你要在应用程序里使用事务管理库时,你的程序分成了两部分。一部分是第三方库的程序,另一部分是应用程序的代码(它需要调用事务管理库中的函数)。本文只讲应用程序代码。

如何在项目中使用事务管理库

要想让业务函数支持事务,需要做两件事。首先,创建数据库链接;其次,使用创建的数据库链接运行SQL语句。我假设你在项目中使用了清晰架构。在这种情况下,“创建数据库链接”会在应用程序容器(详情参见"清晰架构(Clean Architecture)的Go微服务: 程序容器(Application Container)" )中完成,“运行SQL语句”会在业务逻辑(数据持久层)中完成。如果没有使用清晰架构,你可能会使用某种非常类似的分层架构,结构还是一样。如果你没有使用任何框架或分层架构,那么这两种代码可能会在一个地方。

你可能想知道它与没有事务支持的代码有什么不同?几乎没有。不管有没有事务支持,应用程序都要编写相同的代码,事务管理库会在后端处理所有事情。

本文中的所有代码都在"jfeng45/servicetmpl1"中,这是一个能自我进化的微服务框架,它提供了如何使用事务库的例子。

创建数据库链接

创建数据库链接有两种不同的方法,使用哪种方法取决于是否需要缓存数据库链接。

获取数据库链接

下面是创建数据库链接的代码。它在"sqlFactory.go"文件中。因为清晰架构使用了工厂方法模式(factory method pattern),这里的代码是它的一部分。如果你不想使用工厂方法模式,也是一点问题都没有的。因为数据库链接在架构中是要被缓存的,所以框架代码需要调用事务库中的函数“BuildSqlDB()”,它首先检查数据库链接是否已经存在。如果没有,则调用“factory.BuildSqlDB(&tdbc)”来创建一个。在此之前,它获取需要的参数并将它们保存在“DatabaseConfig”中,“DatabaseConfig”也是在事务库中定义的。之后它调用内部函数“buildGdbc()”生成合适的“gdbc.SqlGdbc"接口(要根据你是否需要事务)。最后,检查如果数据库链接不在缓存中,则把它放入缓存。

// implement Build method for SQL database
func (sf *sqlFactory) Build(c container.Container, dsc *config.DataStoreConfig) (DataStoreInterface, error) {
   
	logger.Log.Debug("sqlFactory")
	key := dsc.Code
	//if it is already in container, return
	if value, found := c.Get(key); found {
   
		logger.Log.Debug
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值