Go語言實戰案例-數據庫事務處理

在實際業務中,很多操作需要保證?要么全部成功,要么全部失敗,否則可能造成數據不一致。比如:

  • ? 用戶轉賬(A 賬戶扣款,B 賬戶加款)
  • ? 下單支付(生成訂單、扣減庫存、記錄支付)

這種場景就需要用到?事務(Transaction)

本文將帶你使用 Go 語言 +?GORM?實現數據庫事務處理。


一、事務的基本概念

事務(Transaction)是數據庫中一組不可分割的操作單元,具有四大特性(ACID):

  • ??原子性(Atomicity):事務中的所有操作要么全部成功,要么全部失敗。
  • ??一致性(Consistency):事務執行前后,數據必須保持一致。
  • ??隔離性(Isolation):多個事務之間相互獨立,互不干擾。
  • ??持久性(Durability):事務一旦提交,結果會永久保存。

二、GORM 事務處理方式

GORM 提供了三種事務使用方式:

  1. 1.?手動開啟、提交、回滾
  2. 2.?db.Transaction()?包裹函數(推薦)
  3. 3.?嵌套事務(SavePoint / RollbackTo)

三、實戰案例:用戶轉賬

我們以一個“用戶轉賬”的例子來演示事務操作。

1. 定義模型

package?mainimport?("fmt""gorm.io/driver/mysql""gorm.io/gorm""log"
)type?User?struct?{ID??????uint???`gorm:"primaryKey"`Name????string?`gorm:"size:100"`Balance?int????//?賬戶余額
}var?db?*gorm.DBfunc?initDB()?{dsn?:=?"root:123456@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"var?err?errordb,?err?=?gorm.Open(mysql.Open(dsn),?&gorm.Config{})if?err?!=?nil?{log.Fatal("數據庫連接失敗:",?err)}_?=?db.AutoMigrate(&User{})
}

2. 使用事務完成轉賬

//?Transfer?轉賬函數:fromID?->?toID,金額?amount
func?Transfer(fromID,?toID?uint,?amount?int)?error?{return?db.Transaction(func(tx?*gorm.DB)?error?{var?from,?to?User//?查詢轉出賬戶if?err?:=?tx.First(&from,?fromID).Error;?err?!=?nil?{return?err}if?from.Balance?<?amount?{return?fmt.Errorf("余額不足")}//?扣減余額if?err?:=?tx.Model(&from).Update("balance",?from.Balance-amount).Error;?err?!=?nil?{return?err}//?查詢轉入賬戶if?err?:=?tx.First(&to,?toID).Error;?err?!=?nil?{return?err}//?增加余額if?err?:=?tx.Model(&to).Update("balance",?to.Balance+amount).Error;?err?!=?nil?{return?err}//?所有操作成功?->?提交事務return?nil})
}

3. 測試轉賬

func?main()?{initDB()//?初始化兩位用戶db.Create(&User{Name:?"Alice",?Balance:?100})db.Create(&User{Name:?"Bob",?Balance:?50})//?轉賬:Alice?->?Bob?30元err?:=?Transfer(1,?2,?30)if?err?!=?nil?{log.Println("轉賬失敗:",?err)}?else?{log.Println("轉賬成功")}var?users?[]Userdb.Find(&users)log.Println("當前用戶余額:",?users)
}

四、運行效果

  1. 1. 初始狀態:
Alice:?100
Bob:???50
  1. 2. 轉賬成功后:
Alice:?70
Bob:???80
  1. 3. 如果 Alice 余額不足,事務會回滾:
轉賬失敗:?余額不足
Alice:?100
Bob:???50

五、事務處理注意事項

  1. 1.?事務函數返回?error
    • ? 返回?nil?→ 提交事務
    • ? 返回?error?→ 回滾事務
  2. 2.?不要在事務中使用全局?db
    • ? 必須用傳入的?tx?對象,確保操作在同一事務內。
  3. 3.?事務適合小而快的操作
    • ? 長時間事務會占用鎖,可能導致性能下降。

六、總結

通過本案例,我們學習了:

  • ? 事務的基本概念(ACID)
  • ? GORM 的事務 API(推薦?db.Transaction()
  • ? 用事務實現?用戶轉賬?功能

事務在業務中非常常見,掌握它能讓你的數據庫操作更加安全可靠。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93941.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93941.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93941.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

為何vivo做了頭顯,小米卻選擇AI眼鏡

在押注下一代智能終端這件事上&#xff0c;手機廠商為何步調不一致&#xff1f;文&#xff5c;游勇編&#xff5c;周路平在手機銷量和創新都陷入停滯的背景下&#xff0c;主流手機廠商正在探索下一代交互終端&#xff0c;試圖尋找新的增長點。今年6月&#xff0c;小米發布了AI眼…

Day24 目錄遍歷、雙向鏈表、棧

day24 目錄遍歷、雙向鏈表、棧顯示指定目錄下的所有 .h 文件 功能描述 遍歷指定目錄&#xff08;遞歸進入子目錄&#xff09;&#xff0c;查找所有以 .h 為后綴的頭文件&#xff0c;將其完整路徑&#xff08;路徑 文件名&#xff09;存儲到雙向鏈表中&#xff0c;并正向或反向…

JupyterLab 安裝(python3.10)

目錄 一、環境 二、安裝 三、啟動Jupyterlab 四、通過chrome瀏覽器進行訪問 五、打開Jupyter Notebook 六、pandas驗證 JupyterLab 是一個基于 Web 的交互式開發環境&#xff0c;是經典 Jupyter Notebook 的下一代版本。它支持多種編程語言&#xff08;如 Python、R、Juli…

【neo4j】安裝使用教程

一、安裝 1.0 前置條件 安裝配置好jdk17及以上 注意我使用的是neo4j 5.26.10版本&#xff0c;匹配java17剛好 Java Archive Downloads - Java SE 17.0.12 and earlier 無腦安裝即可 配置以下環境變量 1.1 安裝程序 Neo4j Deployment Center - Graph Database & Anal…

AECS(國標ECALL GB 45672-2025)

車載緊急呼叫功能作為車輛遇險時的響應機制&#xff0c;為司機和乘客的安全營救提供通信支持。為了能夠降低通信延遲&#xff0c;提高響應速度&#xff0c;基于4G/5G的下一代緊急呼叫技術&#xff08;NG eCall&#xff09;將在歐盟于2027年起成為強制標準&#xff0c;中國也已經…

week3-[循環嵌套]好數

week3-[循環嵌套]好數 題目描述 如果一個正整數 xxx 只有最左邊一位不是 000&#xff0c;其余都是 000&#xff0c;那么稱其為好數。例如 400040004000 和 222 都是好數&#xff0c;但是 120120120 不是。 給定正整數 nnn&#xff0c;在 111 到 nnn 間有多少個數是好數&#xf…

智能制造加速器:某新能源車智慧工廠無線網絡優化提升方案

隨著工業4.0和智能制造的快速發展&#xff0c;傳統制造工廠的網絡架構正面臨前所未有的挑戰。為了滿足柔性生產、實時數據驅動以及高可靠運營的需求&#xff0c;某新能源車智慧工廠啟動了一項無線網絡優化提升項目。本項目通過部署智能組網設備&#xff0c;構建高效、穩定、智能…

nginx-自制證書實現

nginx-自制證書實現一、 確認nginx是支持https功能的二、生成私鑰三、 根據ca.key生成nginx web服務器使用的證書簽名請求文件nginx.csr四、使用ca.key給nginx.csr進行簽名&#xff0c;生成公鑰證書nginx.crt五、將證書與域名綁定六、添加域名解析并訪問一、 確認nginx是支持ht…

FreeRTOS,事件標注組創建,xEventGroupCreate、xEventGroupCreateStatic

1. xEventGroupCreate ()&#xff1a;動態創建&#xff08;臨時借內存&#xff09; 作用&#xff1a; 向系統&#xff08;FreeRTOS 的堆內存&#xff09;“臨時申請” 一塊內存來存放事件組&#xff0c;不需要我們自己提前準備內存。 例子&#xff08;基于你的代碼修改&#xf…

Linux網絡socket套接字(上)

目錄 前言 1.Socket編程準備 1.理解源IP地址和目的IP地址 2.認識端口號 3.socket源來 4.傳輸層的典型代表 5.網絡字節序 6.socket編程接口 2.Socket編程UDP 1.服務端創建套接字 2.服務端綁定 3.運行服務器 4.客戶端訪問服務器 5.測試 6.補充參考內容 總結 前言…

RK android14 Setting一級菜單IR遙控器無法聚焦問題解決方法

文章目錄 前言 一、問題分析 1.1. 布局文件分析 1.2. Java代碼 二、解決方法 2.1.移除沖突的滾動標志 2.2.解決有問題的初始化調用 2.3.完整補丁 前言 在Android系統Settings應用(packages/apps/Settings)的首頁(SettingsHomepageActivity)中,存在一個 accessibility (無…

iOS 手勢與控件事件沖突解決清單

總結一份「iOS 手勢與控件事件沖突解決清單」&#xff0c;以后你遇到 UIButton / UITableView / UIScrollView 被手勢攔截就能快速排查了&#xff1a;&#x1f4cc; iOS 手勢與控件事件沖突常見解決辦法1?? cancelsTouchesInView&#x1f449; 最常用&#xff0c;決定手勢識別…

筆試——Day45

文章目錄第一題題目思路代碼第二題題目思路代碼第三題題目思路代碼第一題 題目 kanan和高音 思路 雙指針遍歷數組&#xff0c;更新左右端點并計算最大值 代碼 #include<iostream> #include<vector> using namespace std;int main() {int n; cin >> n;vect…

nnDetection網絡結構分析

基于 RetinaNet 框架擴展&#xff0c;核心用于處理 3D 體積數據&#xff08;如醫學影像 CT/MRI&#xff09;&#xff0c;通過 “Encoder-Decoder-Head” 架構實現多任務學習。以下從整體框架、核心模塊細節、技術特點、應用場景四個維度展開分析。一、整體框架概覽首先通過表格…

Torch -- 卷積學習day4 -- 完整項目流程

完整項目流程總結1. 環境準備與依賴導入import time import os import numpy as np import pandas as pd import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from torch.utils.data import Dat…

MTK Linux DRM分析(七)- KMS drm_plane.c

一、簡介在 Linux DRM&#xff08;Direct Rendering Manager&#xff09;子系統中&#xff0c;Plane&#xff08;平面&#xff09;代表了一個圖像源&#xff0c;可以在掃描輸出過程中與 CRTC 混合或疊加顯示。每個 Plane 從 drm_framebuffer 中獲取輸入數據&#xff0c;并負責圖…

OpenHarmony之 藍牙子系統全棧剖析:從協議棧到芯片適配的端到端實踐(大合集)

1. 系統架構概述 OpenHarmony藍牙系統采用分層架構設計&#xff0c;基于HDF&#xff08;Hardware Driver Foundation&#xff09;驅動框架和系統能力管理&#xff08;System Ability&#xff09;機制實現。 1.1 架構層次 ┌─────────────────────────…

探索 Ultralytics YOLOv8標記圖片

1、下載YOLOv8模型文件 下載地址&#xff1a;https://docs.ultralytics.com/zh/models/yolov8/#performance-metrics 2、編寫python腳本 aaa.py import cv2 import numpy as np from ultralytics import YOLO import matplotlib.pyplot as pltdef plot_detection(image, box…

Matplotlib數據可視化實戰:Matplotlib子圖布局與管理入門

Matplotlib多子圖布局實戰 學習目標 通過本課程的學習&#xff0c;學員將掌握如何在Matplotlib中創建和管理多個子圖&#xff0c;了解子圖布局的基本原理和調整方法&#xff0c;能夠有效地展示多個數據集&#xff0c;提升數據可視化的效果。 相關知識點 Matplotlib子圖 學習內容…

【python實用小腳本-194】Python一鍵給PDF加水印:輸入文字秒出防偽文件——再也不用開Photoshop

Python一鍵給PDF加水印&#xff1a;輸入文字秒出防偽文件——再也不用開Photoshop PDF加水印, 本地腳本, 零會員費, 防偽標記, 瑞士軍刀 故事開場&#xff1a;一把瑞士軍刀救了投標的你 周五下午&#xff0c;你把 100 頁標書 PDF 發給客戶&#xff0c;卻擔心被同行盜用。 想加水…