从 GoFrame ORM
支持数据库嵌套事务。需要注意的是,数据库服务往往并不支持嵌套事务,而是依靠 ORM
组件层通过 Transaction Save Point
特性实现的。同样的,我们推荐使用 Transaction
闭包方法来实现嵌套事务操作。为了保证文档的完整性,因此我们这里仍然从最基本的事务操作方法开始来介绍嵌套事务操作。
一、示例SQL
一个简单的示例 SQL
,包含两个字段 id
和 name
:
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL COMMENT '用户ID',
`name` varchar(45) NOT NULL COMMENT '用户名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
二、常规操作
db := g.DB()
tx, err := db.Begin()
if err != nil {
panic(err)
}
if err = tx.Begin(); err != nil {
panic(err)
}
_, err = tx.Model(table).Data(g.Map{"id": 1, "name": "john"}).Insert()
if err = tx.Rollback(); err != nil {
panic(err)
}
_, err = tx.Model(table).Data(g.Map{"id": 2, "name": "smith"}).Insert()
if err = tx.Commit(); err != nil {
panic(err)
}
1、 db.Begin
与 tx.Begin
可以看到,在我们的嵌套事务中出现了 db.Begin
和 tx.Begin
两种事务开启方式,两者有什么区别呢? db.Begin
是在数据库服务上真正开启一个事务操作,并返回一个事务操作对象 tx