Categorygithub.com/goxiaoy/gorm-concurrency/v2
package
2.0.1
Repository: https://github.com/goxiaoy/gorm-concurrency.git
Documentation: pkg.go.dev

# README

Optimistic concurrency control for gorm

Optimistic concurrency control: wiki: https://en.wikipedia.org/wiki/Optimistic_concurrency_control

Gorm link: https://github.com/go-gorm/gorm

Install

go get github.com/goxiaoy/gorm-concurrency

Add version to your entity

type TestEntity struct {
    ...
	Version concurrency.Version
}

or

type TestEntity struct {
    ...
	concurrency.HasVersion
}

create

	e := TestEntity{
		ID:   1,
		Name: "1",
	}
	err := DB.Create(&e).Error

This field will be auto set before create, or you can set it manually to prevent reflection

update

	err = concurrency.ConcurrentUpdate(DB.Model(&ec), "name", "3").Error
    // To check concurrency error
    // assert.ErrorIs(t, err, ErrConcurrent)
	

or use gorm update

	affected := DB.Model(&ec).Update("name", "3").RowsAffected
    // check affected == 0

The generate sql will be

UPDATE `test_entities` SET `name`="3",`version`="be2e5998-c809-482f-9c9c-64c709ba6ea3" WHERE `test_entities`.`version` = "92658491-bba8-4eba-84ce-a6ea72dcfa4a" AND `id` = 1

Note: Do not use Save method, it will automatically create entities if not found