欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

gorm樂觀鎖使用小結(jié)

 更新時間:2025年08月07日 12:05:00   作者:考慮考慮  
本文主要介紹了gorm樂觀鎖使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

樂觀鎖,顧名思義,就是保持樂觀態(tài)度,在數(shù)據(jù)并發(fā)過程中,不會加鎖,而是在數(shù)據(jù)提交之后,才會檢查沖突,這通過在數(shù)據(jù)表中增加一個版本號(version)字段來實現(xiàn)。如果數(shù)據(jù)在事務(wù)處理期間未被其他事務(wù)修改,那么版本號就不會發(fā)生變化,事務(wù)可以安全提交。如果版本號發(fā)生變化,說明有沖突發(fā)生,事務(wù)需要回滾或重新嘗試

grom樂觀鎖機制

gorm樂觀鎖依賴安裝

Gorm是go中一個優(yōu)秀持久化框架,也提供了樂觀鎖機制,通過以下命令安裝依賴

go get -u gorm.io/plugin/optimisticlock

gorm樂觀鎖使用

在定義實體類過程中,通過加上一個Version版本號控制

import "gorm.io/plugin/optimisticlock"

type User struct {
    Id          int64  `gorm:"primary_key;type:bigint(20);not null;column:id;comment:'主鍵id';" json:"id"`
    UserName    string `gorm:"column:userName"`
    Sex         int    `gorm:"column:sex"`
    Version     optimisticlock.Version
    CreateTime  time.Time `gorm:"column:create_time;datetime(3);autoUpdateTime" json:"createTime"` // 創(chuàng)建時間
    UpdatedTime time.Time `gorm:"column:update_time;datetime(3);autoUpdateTime" json:"updateTime"` // 更新時間
}

創(chuàng)建一個user表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '\'主鍵id\'',
  `userName` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL,
  `sex` bigint NULL DEFAULT NULL,
  `version` bigint NULL DEFAULT NULL,
  `create_time` datetime(3) NULL DEFAULT NULL,
  `update_time` datetime(3) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

插入數(shù)據(jù)

插入一條id為2的數(shù)據(jù)

package main

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/schema"
    "log"
    "time"
)

import "gorm.io/plugin/optimisticlock"

type User struct {
    Id          int64  `gorm:"primary_key;type:bigint(20);not null;column:id;comment:'主鍵id';" json:"id"`
    UserName    string `gorm:"column:userName"`
    Sex         int    `gorm:"column:sex"`
    Version     optimisticlock.Version
    CreateTime  time.Time `gorm:"column:create_time;datetime(3);autoUpdateTime" json:"createTime"` // 創(chuàng)建時間
    UpdatedTime time.Time `gorm:"column:update_time;datetime(3);autoUpdateTime" json:"updateTime"` // 更新時間
}

func main() {
    dsn := "root:root@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
       NamingStrategy: schema.NamingStrategy{
          SingularTable: true, // 使用單數(shù)表名
       },
    })
    if err != nil {
       log.Println("連接數(shù)據(jù)庫錯誤:", err)
       return
    }

    var user = User{
       UserName: "aaa",
       Sex:      1,
    }
    result := db.Table("user").Create(&user)
    log.Println(result)
    log.Println(user)
    //var user1 User
    //db.Table("user").First(&user1, "id = ?", 1)
    //log.Println(user1)
    //user1.UserName = "bbbb"
    //result1 := db.Table("user").Save(&user1)
    //fmt.Println(result1)
}

這時候版本為1

版本號更新

這時候把id=2的數(shù)據(jù)查出來,進行更新操作,版本號會發(fā)生變化

package main

import (
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/schema"
    "log"
    "time"
)

import "gorm.io/plugin/optimisticlock"

type User struct {
    Id          int64  `gorm:"primary_key;type:bigint(20);not null;column:id;comment:'主鍵id';" json:"id"`
    UserName    string `gorm:"column:userName"`
    Sex         int    `gorm:"column:sex"`
    Version     optimisticlock.Version
    CreateTime  time.Time `gorm:"column:create_time;datetime(3);autoUpdateTime" json:"createTime"` // 創(chuàng)建時間
    UpdatedTime time.Time `gorm:"column:update_time;datetime(3);autoUpdateTime" json:"updateTime"` // 更新時間
}

func main() {
    dsn := "root:root@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
       NamingStrategy: schema.NamingStrategy{
          SingularTable: true, // 使用單數(shù)表名
       },
    })
    if err != nil {
       log.Println("連接數(shù)據(jù)庫錯誤:", err)
       return
    }

    var user1 User
    db.Table("user").First(&user1, "id = ?", 2)
    log.Println(user1)
    user1.UserName = "bbbb"
    result1 := db.Table("user").Save(&user1)
    fmt.Println(result1)
}

這時候可以看到更新成功,版本號變成2

總結(jié)

樂觀鎖機制,可以有效保證在并發(fā)過程修改數(shù)據(jù)過程中的不安全問題,但是后面更新失敗的問題,根據(jù)項目,具體問題具體分析

到此這篇關(guān)于gorm樂觀鎖使用小結(jié)的文章就介紹到這了,更多相關(guān)gorm 樂觀鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go|使用Options模式和建造者模式創(chuàng)建對象實戰(zhàn)

    Go|使用Options模式和建造者模式創(chuàng)建對象實戰(zhàn)

    這篇文章主要介紹了Go使用Options模式和建造者模式創(chuàng)建對象實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • golang 歸并排序,快速排序,堆排序的實現(xiàn)

    golang 歸并排序,快速排序,堆排序的實現(xiàn)

    本文主要介紹了golang 歸并排序,快速排序,堆排序的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Golang語言JSON解碼函數(shù)Unmarshal的使用

    Golang語言JSON解碼函數(shù)Unmarshal的使用

    本文主要介紹了Golang語言JSON解碼函數(shù)Unmarshal的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Go語言帶緩沖的通道實現(xiàn)

    Go語言帶緩沖的通道實現(xiàn)

    這篇文章主要介紹了Go語言帶緩沖的通道實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 淺析Go使用定時器時如何避免潛在的內(nèi)存泄漏陷阱

    淺析Go使用定時器時如何避免潛在的內(nèi)存泄漏陷阱

    這篇文章來和大家一起探討一下Go?中如何高效使用?timer,特別是與select?一起使用時,如何防止?jié)撛诘膬?nèi)存泄漏問題,感興趣的可以了解下
    2024-01-01
  • Go語言Swagger實現(xiàn)為項目生成 API 文檔

    Go語言Swagger實現(xiàn)為項目生成 API 文檔

    Swagger 是一個基于 OpenAPI 規(guī)范設(shè)計的工具,用于為 RESTful API 生成交互式文檔,下面小編就來介紹一下如何在 Go 項目中集成 Swagger,特別是結(jié)合 Gin 框架生成 API 文檔
    2025-03-03
  • Go語言實現(xiàn)二進制與十進制互轉(zhuǎn)的示例代碼

    Go語言實現(xiàn)二進制與十進制互轉(zhuǎn)的示例代碼

    這篇文章主要和大家詳細介紹了Go語言中實現(xiàn)二進制與十進制互相轉(zhuǎn)換的示例代碼,文中的代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • Go語言MessageBox用法實例

    Go語言MessageBox用法實例

    這篇文章主要介紹了Go語言MessageBox用法,實例分析了MessageBox提示框的實現(xiàn)與使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Go如何優(yōu)雅的關(guān)閉goroutine協(xié)程

    Go如何優(yōu)雅的關(guān)閉goroutine協(xié)程

    本文將介紹首先為什么需要主動關(guān)閉goroutine,并介紹如何在Go語言中關(guān)閉goroutine的常見套路,包括傳遞終止信號和協(xié)程內(nèi)部捕捉終止信號,之后,文章列舉了需要主動關(guān)閉協(xié)程運行的常見場景,希望通過本文的介紹,讀者能夠掌握如何在適當(dāng)?shù)臅r候關(guān)閉goroutine
    2023-05-05
  • golang獲取網(wǎng)卡信息操作

    golang獲取網(wǎng)卡信息操作

    這篇文章主要介紹了golang獲取網(wǎng)卡信息操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論