MYSQL 悲观锁#
tx := db.DB.Begin()
if err := tx.Set("gorm:query_option", "FOR UPDATE").
Where("`xx` = ? and `xxx` = ?", xx, xxx).
First(&xx).Error; err != nil {
tx.Rollback()
return
}
在事务中使用 Set("gorm:query_option", "FOR UPDATE") + first 能将查询的这条记录锁住;
在事务 rollback 或 commit 后会 unlock。
创建复合主键(当主键涉及自增时)#
gorm:"primary_key;AUTO_INCREMENT:false"
连接数据库#
步骤分析#
- 引入mysql数据库驱动
- 引入gorm包
- 读取配置文件中的数据库信息
- 将读取的数据生成为Open()需要的字符串
代码示例#
package base
import (
_ "github.com/go-sql-driver/mysql"
_ "github.com/jinzhu/gorm/dialects/mysql"
"github.com/jinzhu/gorm"
"fmt"
"log"
)
var (
DB *gorm.DB
user = "user"
password = "password"
dbname = "dbname"
address = "address"
port = "port"
)
func DBConnect() {
dsn := fmt.Sprintf("%s:%s@tcp(%s:@s)/%s?charset=utf8&parseTime=True&loc=Local",
user,
password,
address,
port,
dbname)
var err error
DB, err = gorm.Open("mysql", dsn)
//"user:password@/dbname?charset=utf8&parseTime=True&loc=Local"
if err != nil {
log.Faltal("Opening mysql error is :", err)
}
}