Gorm之事务
有一个bank表,它存着相关用户的数据:

初始化表
//bank.go
type Bank struct {
Id int
Username string
Balance float32
}
func (Bank) TableName() string {
return "bank"
}
//controller.go
type BankController struct {
BaseController
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1、查询bank中用户的所有信息
func (con BankController) Index(c *gin.Context) {
bankList := []models.Bank{}
//查询所有数据
models.DB.Preload("Lesson").Find(&bankList)
c.JSON(http.StatusOK, gin.H{
"result": bankList,
})
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 2、bank转账操作
func (con BankController) Tran(c *gin.Context) {
//张三给李四转账
tx := models.DB.Begin()
//在事务中执行一些db操作时,不可以用db,应该使用tx
defer func() {
if r := recover(); r != nil {
//遇到错误时回滚事务
tx.Rollback()
//转账失败
con.Error(c)
return
}
}()
u1 := models.Bank{Id: 1}
tx.Find(&u1)
//张三账户转出100元
u1.Balance = u1.Balance - 100
if err := tx.Save(&u1).Error; err != nil {
//遇到错误时回滚事务
tx.Rollback()
//转账失败
con.Error(c)
return
}
//panic("异常")
u2 := models.Bank{Id: 2}
tx.Find(&u2)
//李四账户转入100元
u2.Balance = u2.Balance + 100
if err := tx.Save(&u2).Error; err != nil {
//遇到错误时回滚事务
tx.Rollback()
//转账失败
con.Error(c)
}
//否则,提交事务
tx.Commit()
//转账成功
con.Success(c)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
编辑 (opens new window)