全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📝 1 篇文章 20 道配套习题

事务处理专题

专题说明

本专题深入讲解 GORM 事务处理机制,涵盖事务的创建、提交与回滚、嵌套事务与保存点(SavePoint)、事务回调与钩子、事务隔离级别,以及在并发场景下确保数据一致性的最佳实践。

学习目标

  1. 掌握 GORM 事务的三种使用方式(Transaction/Begin+Commit+Rollback)
  2. 理解嵌套事务和保存点的原理与应用场景
  3. 学会处理事务中的错误和异常情况
  4. 掌握事务隔离级别及其对并发控制的影响

学习内容

本专题涵盖以下知识点:

  • Transaction 闭包方式事务
  • Begin/Commit/Rollback 手动事务
  • 嵌套事务与 SavePoint/RollbackTo
  • 事务中的钩子与回调
  • 事务隔离级别配置
  • 事务超时与锁机制

学习建议

  1. 优先使用 Transaction 闭包方式,自动处理提交和回滚
  2. 理解不同隔离级别的性能与一致性权衡
  3. 注意事务中的长耗时操作可能导致连接占用

📝 发现内容有误?点击此处直接编辑

📝 配套习题(20 题)

1
单选题

在 GORM 中,如何开始一个事务?

A

db.Begin()

B

db.StartTransaction()

C

db.Transaction(func(tx *gorm.DB) error { ... })

D

以上都是

2
多选题

以下关于 GORM 事务使用的描述,哪些是正确的?

A

db.Transaction 方法会自动处理 Commit 和 Rollback

B

手动事务需要调用 tx.Commit() 或 tx.Rollback()

C

事务中的错误应该返回 error,由 Transaction 方法处理

D

事务只能包含单个数据库操作

3
填空题

使用 db.Transaction 时,如果函数返回______则自动提交事务,如果返回______则自动回滚事务。

4
判断题

使用 db.Begin() 开始事务后,如果忘记调用 tx.Commit(),事务会自动回滚。

A

B

5
单选题

GORM 如何实现嵌套事务(保存点)?

A

使用 tx.Begin() 嵌套

B

使用 tx.SavePoint("name") 和 tx.RollbackTo("name")

C

使用 tx.NestedTransaction()

D

GORM 不支持嵌套事务

6
多选题

以下哪些场景适合使用嵌套事务(保存点)?

A

批量操作中某条记录失败需要回滚

B

需要在事务中尝试多个操作,失败则回退某步

C

所有操作必须全部成功或全部失败

D

需要在事务中间点设置恢复点

7
填空题

使用 tx.SavePoint("______") 创建保存点后,可以使用 tx.RollbackTo("______") 回滚到该点,而不影响保存点之前的操作。

8
单选题

在 GORM 中,如何在多个方法之间传递同一个事务?

A

使用全局变量传递 tx 对象

B

使用 db.WithContext(ctx) 传递上下文

C

使用 Session 传递事务配置

D

GORM 不支持事务传递

9
多选题

以下哪些是在 GORM 中传递事务的推荐方式?

A

将 tx 作为参数传递给 Service 方法

B

使用 context.Context 存储事务

C

使用 db.Session(&Session{NewDB: true})

D

使用全局变量存储事务

10
判断题

GORM 的 Session 可以用来传递事务状态,多个方法共用同一个 Session 就共用同一个事务连接。

A

B

11
单选题

以下哪个是 SQL 标准定义的事务隔离级别中,最低的隔离级别?

A

ReadUncommitted

B

ReadCommitted

C

RepeatableRead

D

Serializable

12
多选题

ReadCommitted 隔离级别可以避免以下哪些问题?

A

脏读

B

不可重复读

C

幻读

D

脏写

13
填空题

在 GORM 中设置事务隔离级别可以使用 db.Session(&gorm.Session{___________: true}).______() 后执行原生 SQL 设置,或使用数据库特定的配置方法。

14
判断题

MySQL InnoDB 引擎默认使用 RepeatableRead 隔离级别。

A

B

15
单选题

GORM 中实现软删除最简单的方式是什么?

A

手动实现 IsDeleted 字段

B

使用 gorm.DeletedAt 类型

C

使用 BeforeDelete 钩子

D

使用数据库触发器

16
多选题

使用 gorm.DeletedAt 实现软删除后,以下哪些操作会受到影响?

A

普通查询自动过滤已删除记录

B

Delete 操作变为更新 DeletedAt

C

唯一索引需要考虑 DeletedAt

D

Count 统计不包含已删除记录

17
判断题

如果某个字段有唯一索引,使用软删除后,删除的记录不能再次使用相同的值插入。

A

B

18
单选题

如何查询包括已删除的所有记录?

A

db.Find(&users)

B

db.Unscoped().Find(&users)

C

db.IncludeDeleted().Find(&users)

D

db.All(&users)

19
多选题

以下哪些场景需要使用 Unscoped() 方法?

A

查询已删除的记录用于审计

B

执行硬删除操作

C

恢复已删除的记录

D

统计包括已删除的总记录数

20
填空题

GORM 对包含 DeletedAt 字段的模型,普通查询会自动添加________________________条件,使用________方法可以取消该过滤。

← 上一个专题 GORM 基础概念专题
下一个专题 → 关联关系管理专题

📝 发现内容有误?点击此处直接编辑

想查看更多习题和详细解析?
小程序提供完整的题库和详细解析

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库