CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`passwd` varchar(32) DEFAULT NULL,
`created` datetime DEFAULT NULL,
`updated` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
数据库表user对应的实体类的定义如下:
type User struct {
Id int64 `db:"id;autoincr"`
Name string `db:"name"`
Age int64 `db:"age"`
Passwd string `db:"passwd"`
Created time.Time `db:"created;n_update"`
func (ent *User) TableName() string {
return "user"
worm使用名称为"db"的Tag映射数据库字段,"db"后面是字段的名称,autoincr用于说明该字段是自增ID,n_update用于说明该字段不可用于update语句中。
当使用事务处理时,需要调用worm.NewSession()来创建Session对象,并调用TxBegin()函数开启数据库事务。在事务中可以混用Struct映射、原生SQL以及SQLBuilder来访问数据库:
func demoTxCommit() {
tx := worm.NewSession()
tx.TxBegin()
var user = User{Name:"name1", Age: 21, Created: time.Now()}
id, err := tx.Model(&user).Insert()
if err != nil{
tx.TxRollback()
return
_, err = tx.Table("user").Value("age", 20).Value("name", "zhangsan").Where("id=?", id).Update()
if err != nil{
tx.TxRollback()
return
_, err = tx.SQL("delete from user where id=?", id).Exec()
if err != nil{
tx.TxRollback()
return
tx.TxCommit()
之前,学习了对数据库的每个表执行CRUD操作。真实的场景中,我们经常需要执行一个事务,它组合了多个表的相关操作。本节学习如何在Golang中实现它。
在开始之前,先聊一下事务。
什么是数据库事务?
它是一个单一的工作单元,通常由多个表操作组成。
比如:在我们的小银行项目中,我们要从张三的账户中向李四的账户中转账10元。该交易就包括5个操作,涉及到accounts表、entries表和transfers表:
创建一个金额等于10的转账记录(transfers表)
为张三创建一个账目记录,金额为-10(ent
func Transaction(f func(session *xorm.Session) error) error {
var err error
session := engine().NewSession()
if err = session.Begin(); err != nil {
log.Error("session begin failed, err msg: %s", err.Error())
return fm
转载:https://www.cnblogs.com/jackylee92/p/6209596.html
这里使用的是github.com/Go-SQL-Driver/MySQL,
所以需要下载一个github.com/Go-SQL-Driver/MySQL
引入 database/sql 和github.com/Go-SQL-Driver/MySQL
这里实现了对数据库的 增、删、改...
修改数据的语句用Exec(),最好用事先准备好的声明,来实现的INSERT, UPDATE,DELETE,或其他不返回行的语句。以下示例显示如何插入行并检查有关操作的元数据:stmt, err := db.Prepare("INSERT INTO users(name) VALUES(?)")
if err != nil {
log.Fatal(err)
res, err := stmt.E...
上一节,学习了如何实现一个简单的转账
事务,但是,我们还没做更新账户余额的操作,因为,它稍复杂一些,需要小心处理并发
事务以避免死锁。
本节,将实现这个功能,顺便学习一下
数据库锁,以及如何调试死锁的情况。
测试驱动
开发(TDD)
这次,将
使用一种不同的实现方式,即测试驱动
开发(TDD)。
思路是:首先编写测试,然后逐渐改进功能代码直到测试通过。
接着上一节的store_test.go,需要TODO的地方,检查更新后的账户余额
// 3. 为`ToAccount`创建一个账目记录,金额为`+10`
1.mysql的事物
1).事物介绍:mysql中的事物要么全部执行,要么全部不执行。事物将一些列数据库操作集中到一起执行,要么都成功,要么都失败。只有innodb才支持事物
2).事务的特性:
原子性:一个事务中的所有操作,要么全部完成,要么全部不完成
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏
隔离性:多个事物互不干扰,隔离性可以防止多个事务并发执行而导致数据的不一致。事务隔离级别:读未提交(Re
通过以上步骤,我们成功地在Go语言中实现了MySQL数据库事务。需要注意的是,在实际应用中,可能需要根据具体需求对事务进行更复杂的处理,如异常处理、回滚策略等。下面是一个简单的教程,演示如何在Go语言中实现MySQL数据库事务。方法,我们可以开启一个新的数据库事务。如果出现错误,我们使用。如果提交过程中出现错误,我们同样使用。如果有任何问题,请随时提问。在Go语言中实现MySQL数据库事务可以通过使用。如果出现错误,我们使用。方法来预编译SQL语句,并通过。在上述代码中,我们使用。在以上代码中,我们使用。