golang中如何实现db事务的统一封装
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,小编给大家分享一下golang中如何实现db事务的统一封装,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!事务处理的流程示例
千家信息网最后更新 2025年01月18日golang中如何实现db事务的统一封装简单封装
偷懒第一步
偷懒第二步
偷懒第三步
进一步封装
小编给大家分享一下golang中如何实现db事务的统一封装,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
事务处理的流程示例
database := db.DB tx, err := database.Begin() if err != nil { return err } stmt, err := tx.Prepare(sqlQuery) if err != nil { tx.Rollback() return err } _, err = stmt.Exec(paras...) if err != nil { tx.Rollback() return err } err = tx.Commit() if err != nil { tx.Rollback() return err }
以上是我们使用事务时的一般操作,如果每做一次事务的操作均要进行重新写一遍代码岂不是很麻烦,尤其是出错时,Rollback需要多次在不同错误的地方的进行调用处理。
简单封装
偷懒第一步
采用defer处理Rollback
defer tx.Rollback()
无论成功与否,均进行Rollback操作,只是有点影响,如果成功还调用Rollback的话,将会报错。虽然可以忽略,但作为程序员,有必要进一步调整。
偷懒第二步
根据执行结果来选择执行Rollback,避免无效使用。
defer func() { //根据执行结果选择执行Rollback if err != nil && tx != nil { log.Println("ExecSqlWithTransaction defer err :", err) tx.Rollback() } }()
如此,我们就可以根据事务的执行结果决定是否Rollback了。
偷懒第三步
封装,以上代码本身就具有极大的普适性,因此,我们抽出通用的参数,将此过程封装成一个func,以后就可以直接调用了。
func ExecSqlWithTransaction(database *sql.DB, query string, args ...interface{}) (err error) { tx, err := database.Begin() if err != nil { return err } defer func() { if err != nil && tx != nil { tx.Rollback() } }() stmt, err := tx.Prepare(query) if err != nil { return err } defer stmt.Close() _, err = stmt.Exec(args...) if err != nil { return err } return tx.Commit()}
封装后我们可以如下使用:
if err := ExecSqlWithTransaction(database,sqlQuery,paras...);err != nil{ //错误处理}
封装后是不是很简洁啊?
进一步封装
在一个事务中可能会出现多个SELECT、UPDATE等操作,以上封装仅处理了一种操作,还不能满足我们的实际需求,因此需要更进一步封装。
func ExecSqlWithTransaction(db *sql.DB, handle func(tx *sql.Tx) error) (err error) { tx, err := db.Begin() if err != nil { return err } defer func() { if err != nil { tx.Rollback() } }() if err = handle(tx); err != nil { return err } return tx.Commit()}
在handle func内可以直接使用事务tx进行增删改查。
以上是"golang中如何实现db事务的统一封装"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
封装
事务
处理
篇文章
结果
统一
成功
代码
内容
错误
进一
选择
不同
简洁
必要
更进一步
不怎么
参数
只是
地方
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发与软件测试职业能力要求
sqlplus启动数据库
软件开发甲级资质名录
TECO服务器故障码
瑞斯康达软件开发
计算机网络技术与应用的定义
财务软件开发工作量
以下不属于关系型数据库的是()
windows数据库怎么找
网络安全信息专业大学排名
南京app软件开发收费多少
服务器怎么做安全加固
数据库查询前5个数据
南京软件开发去哪学
实体服务器安全组未放行
茂名服务器除尘设备
关于网络安全的电影4
农行本科软件开发待遇
网络安全规划研究
身边用到计算机网络技术的
存储服务器更换硬盘可以热插拔嘛
泛微php数据库
如何测试服务器是不是强制安装
反向代理降低服务器成本
天津网络技术咨询职责
地盘网络安全海报
数据库查询is系的信息
互联网科技公司出纳
湖州工业软件开发流程
绵阳市览众网络技术有限公司