Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/goxiaoy/gorm-concurrency
Optimistic concurrency control for gorm
https://github.com/goxiaoy/gorm-concurrency
Last synced: 4 months ago
JSON representation
Optimistic concurrency control for gorm
- Host: GitHub
- URL: https://github.com/goxiaoy/gorm-concurrency
- Owner: goxiaoy
- Created: 2021-05-01T07:04:29.000Z (almost 4 years ago)
- Default Branch: master
- Last Pushed: 2023-10-25T16:39:12.000Z (over 1 year ago)
- Last Synced: 2024-10-02T09:03:20.365Z (4 months ago)
- Language: Go
- Size: 22.5 KB
- Stars: 5
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
Awesome Lists containing this project
README
# Optimistic concurrency control for gorm
Optimistic concurrency control:
wiki: https://en.wikipedia.org/wiki/Optimistic_concurrency_controlGorm
link: https://github.com/go-gorm/gormInstall
```
go get github.com/goxiaoy/gorm-concurrency
```Add `version` to your entity
``` go
type TestEntity struct {
...
Version concurrency.Version
}
```
or
``` go
type TestEntity struct {
...
concurrency.HasVersion
}
```create
``` go
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
``` go
err = concurrency.ConcurrentUpdate(DB.Model(&ec), "name", "3").Error
// To check concurrency error
// assert.ErrorIs(t, err, ErrConcurrent)
```or use gorm update
``` go
affected := DB.Model(&ec).Update("name", "3").RowsAffected
// check affected == 0
```The generate sql will be
``` sql
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