您的位置:58脚本 > go 链式调用 GoFrame 链式操作-事务处理

go 链式调用 GoFrame 链式操作-事务处理

2023-03-13 21:32 GoFrame教程

go 链式调用 GoFrame 链式操作-事务处理

go 链式调用

Go语言支持链式调用,它是一种编程技术,可以将多个函数或方法连接在一起,以便在一行中完成多个操作。链式调用可以使代码更加简洁、易读,并且可以减少重复的代码。

Go语言中的链式调用是通过将函数或方法的返回值传递到下一个函数或方法中来实现的。例如,假设有一个名为“add”的函数,它可以将两个整数相加并返回其和。如果要将三个整数相加,则可以使用链式调用来实现:

sum := add(1, 2).add(3) // sum = 6

上面的代码中,add() 函数会先将 1 和 2 相加,然后将 3 传递到 add() 函数中并返回最后的和 6。

此外,Go语言也允许在链式调用中使用匿名函数。例如:

(func(x int) int { return x * x }).(func(x int) int { return x + 1 })(2)

上面的代码会首先执行匿名函数 (func(x int) int { return x * x }) (即将 2 的平方作为参数传递到匿名函数中) ;然后再执行 (func(x int) int { return x + 1 }) (即将 4 作为参数传递到匿名函数中并返回 5 ) 。

GoFrame 链式操作-事务处理

Model​对象也可以通过​TX​事务对象创建,通过事务对象创建的​Model​对象与通过​DB​数据库对象创建的​Model​对象功能是一样的,只不过前者的所有操作都是基于事务,而当事务提交或者回滚后,对应的​Model​对象不能被继续使用,否则会返回错误。因为该​TX​对象不能被继续使用,一个事务对象仅对应于一个事务流程,​Commit/Rollback​后即结束。

示例1,通过Transaction

为方便事务操作,​gdb​提供了事务的闭包操作,通过​Transaction​方法实现,该方法定义如下:

func (db DB) Transaction(ctx context.Context, f func(ctx context.Context, tx *TX) error) (err error)

当给定的闭包方法返回的​error​为​nil​时,那么闭包执行结束后当前事务自动执行​Commit​提交操作;否则自动执行​Rollback​回滚操作。

如果闭包内部操作产生​panic​中断,该事务也将进行回滚。

func Register() error {
	return db.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
		var (
			result sql.Result
			err    error
		)
		// 写入用户基础数据
		result, err = tx.Table("user").Insert(g.Map{
			"name":  "john",
			"score": 100,
			//...
		})
		if err != nil {
			return err
		}
		// 写入用户详情数据,需要用到上一次写入得到的用户uid
		result, err = tx.Table("user_detail").Insert(g.Map{
			"uid":   result.LastInsertId(),
			"phone": "18010576258",
			//...
		})
		return err
	})
}

示例2,通过TX链式操作

我们也可以在链式操作中通过​TX​方法切换绑定的事务对象。多次链式操作可以绑定同一个事务对象,在该事务对象中执行对应的链式操作。

func Register() error {
	var (
		uid int64
		err error
	)
	tx, err := g.DB().Begin()
	if err != nil {
		return err
	}
	// 方法退出时检验返回值,
	// 如果结果成功则执行tx.Commit()提交,
	// 否则执行tx.Rollback()回滚操作。
	defer func() {
		if err != nil {
			tx.Rollback()
		} else {
			tx.Commit()
		}
	}()
	// 写入用户基础数据
	uid, err = AddUserInfo(tx, g.Map{
		"name":  "john",
		"score": 100,
		//...
	})
	if err != nil {
		return err
	}
	// 写入用户详情数据,需要用到上一次写入得到的用户uid
	err = AddUserDetail(tx, g.Map{
		"uid":   uid,
		"phone": "18010576259",
		//...
	})
	return err
}

func AddUserInfo(tx *gdb.TX, data g.Map) (int64, error) {
	result, err := g.Table("user").TX(tx).Data(data).Insert()
	if err != nil {
		return 0, err
	}
	uid, err := result.LastInsertId()
	if err != nil {
		return 0, err
	}
	return uid, nil
}

func AddUserDetail(tx *gdb.TX, data g.Map) error {
	_, err := g.Table("user_detail").TX(tx).Data(data).Insert()
	return err
}


阅读全文
以上是58脚本为你收集整理的go 链式调用 GoFrame 链式操作-事务处理全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
  • svg圆形进度条 SVG 圆形

    svg圆形进度条 SVG 圆形

    SVG circle 通过 circle 可以绘制一个圆形,它只有3个属性用来设置圆形。SVG 圆形 - circle circle 标签可用来创建一个圆: 下面...

  •  XSL-FO table-cell 对象

    XSL-FO table-cell 对象

    XSL-FO table-cell 对象XSL-FO 参考手册定义和用法 fo:table-cell 对象是一个包含表格单元格内容的容器。语法fo:table-cell!--Co...

  •  XML Schema element 元素

    XML Schema element 元素

    XML Schema element 元素 完整 XML Schema 参考手册定义和用法 element 元素定义一个元素。 元素信息 父元素: schema, choice, ...

  •  XML Schema simpleContent 元素

    XML Schema simpleContent 元素

    XML Schema simpleContent 元素 完整 XML Schema 参考手册定义和用法 simpleContent 元素包含对 complexType 元素(它以字符数据...

  •  XML Schema notation 元素

    XML Schema notation 元素

    XML Schema notation 元素 完整 XML Schema 参考手册 定义和用法 notation 元素描述 XML 文档中非 XML 数据的格式。 元素信息 父...

  •  XQuery 术语

    XQuery 术语

    XQuery 术语 在 XQuery 中,节点是它的一个术语,本节将为你介绍这个术语。在 XQuery 中,有七种节点:元素、属性、文本、命名空...

  •  XSLT <xsl:output> 元素

    XSLT <xsl:output> 元素

    XSLT xsl:output 元素XSLTxsl:output元素用于定义文档的输出格式,请参考本节中的实例。 完整的 XSLT 元素参考手册定义和用法 xs...

  •  DTD 实体

    DTD 实体

    DTD - 实体 本节介绍 DTD 中的实体声明,在 DTD 中进行实体声明的时候,将使用ENTITY 关键字来声明。实体是用于定义引用普通文本...

  •  XPath 节点

    XPath 节点

    XPath 节点 本节为你介绍 XPath 中节点的相关知识,主要介绍了 XPath 节点的关系。XPath 术语 节点 在 XPath 中,有七种类型的节...

  • xml dom XML DOM baseURI 属性

    xml dom XML DOM baseURI 属性

    XML DOM baseURI 属性 Element 对象定义和用法 baseURI 属性返回 xml 文档的位置(URI)。 语法elementNode.baseURI 实例 下面的...

© 2024 58脚本 58jiaoben.com 版权所有 联系我们
桂ICP备12005667号-28 Powered by CMS