The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
jmtung

golang 有没办法在同个事务里面执行多个函数逻辑

  •  
  •   jmtung · Dec 9, 2020 · 4583 views
    This topic created in 2155 days ago, the information mentioned may be changed or developed.

    不用函数传参的情况下,实现类似以下的功能,在 php 里面能用单请求下的数据库单例实现,go 有没有类似的方案。搜了一下在 java 那边应该叫事务传播或者需要一个事务管理器。

    func f1(){
    // update user
    }
    
    func f2(){
    // update order
    }
    
    func main(){
      tx,_ := db.Begin()
      f1()
      f2()
      tx.Commit()
    }
    
    11 replies  •  2020-12-10 09:56:44 +08:00
    labulaka521
    labulaka521
    Dec 9, 2020 via iPhone
    1
    放在 ctx 里
    juzzle
    juzzle
    Dec 9, 2020
    2
    @labulaka521 ctx 也需要传递给函数呀
    dobelee
    dobelee
    Dec 9, 2020 via iPhone
    3
    你都不用 ctx 的吗?
    damngood
    damngood
    Dec 9, 2020
    4
    `func (ur *UserRepo) FetchUsersWithFilter(queryer sqlx.Queryer, filter *spms.UserFilter) ([]*spms.User, error) `

    第一个参数既可以传事务也可以非事务, 我目前是这么做的.
    godcc
    godcc
    Dec 9, 2020
    5
    好像只能把 tx 传进去
    jmtung
    jmtung
    OP
    Dec 9, 2020 via Android
    6
    感谢楼上大佬们的回答
    @dobelee ctx 或者直接传 db 都是考虑过的,也是目前能想到的方式。但是这样的写法放在纯业务系统上感觉会复杂化了,所以寻求有没有更好的方式
    CEBBCAT
    CEBBCAT
    Dec 9, 2020 via Android
    7
    我想到的是这样:
    1. 定义一个结构体,将 tx 放入结构体后调用结构体的用户、订单更新函数
    2. 参考 gin 的中间件的 c.Next () 的设计,但这样想必更复杂了

    可能是我没读懂,为什么一定要不传入相关参数呢?这样是不是合理呢?

    btw,我觉得可以讨论的一个问题是,什么样的编程思想才是 go 的
    cheng6563
    cheng6563
    Dec 10, 2020 via Android
    8
    Java 那边的事务管理器也是 spring 给的,不用 spring 就要自己实现这个逻辑。
    基本上就是第一次启动事务是真的启动并保持连接,如果调了其他函数再启动事务只是把递归计数器+1 。直到最外层的事务提交才是真的提交事务并释放连接。回滚同理。
    当然还有其他事务传播策略,比如利用保存点什么的。
    话说 orm 框架没处理这种事吗。
    lewis89
    lewis89
    Dec 10, 2020
    9
    @cheng6563 #8 golang 目前没有这些 类似切面处理逻辑的玩意 所以我不用 golang,spring 的声明式事务 基本上在切面已经处理的干干净净了没必要操心这种事情,有问题需要回滚 异常抛出去就行了
    Yooloo
    Yooloo
    Dec 10, 2020
    10
    gorm 有嵌套`事务
    zarte
    zarte
    Dec 10, 2020
    11
    xorm 实现事务需要同个 session,实现不了你这个。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2382 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 81ms · UTC 00:05 · PVG 08:05 · LAX 16:05 · JFK 19:05
    ♥ Do have faith in what you're doing.