# 嵌套事务模型使用 上一章节我们介绍了,简单事务模型的使用,大多数场景使用简单事务模型即可满足我们的需求,但实际业务开发过程中我们会发现依然还有一些特殊场景,我们需要使用嵌套事务来进行事务处理。本xorm版本也提供了嵌套事务的支持。当使用嵌套事务模型进行事务处理时,同样也需要创建Session对象,与使用简单事务模型进行事务处理不同在于,使用`session.Begin()`创建简单事务时,直接在同一个session下操作,而使用嵌套事务模型进行事务处理时候,使用`session.BeginTrans()`创建嵌套事务时,将返回Transaction实例,后续操作则在同一个Transaction实例下操作。在进行具体数据库操作时候,则使用`tx.Session()`API可以获得当前事务所持有的session会话,从而进行Get(),Find(),Execute()等具体数据库操作。 示例代码如下: ~~~ session := engine.NewSession() defer session.Close() // add BeginTrans() before any action tx, err := session.BeginTrans() if err != nil { return } user1 := Userinfo{Username: "xiaoxiao", Departname: "dev", Alias: "lunny", Created: time.Now()} _, err = tx.Session().Insert(&user1) if err != nil { tx.Rollback() return } user2 := Userinfo{Username: "yyy"} _, err = tx.Session().Where("id = ?", 2).Update(&user2) if err != nil { tx.RollbackTrans() return } _, err = tx.Session().Exec("delete from userinfo where username = ?", user2.Username) if err != nil { tx.RollbackTrans() return } _, err = tx.Session().SqlMapClient("delete.userinfo", user2.Username).Execute() if err != nil { tx.RollbackTrans() return } // add CommitTrans() after all actions err = tx.CommitTrans() if err != nil { ... return } ~~~