数据库的事务操作

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL DuckDB 分析主实例,集群系列 8核16GB
简介: 数据库的事务操作

什么是数据库事务

数据库事务是一组数据库操作的执行单元,它们要么全部成功地执行,要么全部不执行。

事务是确保数据库数据一致性和完整性的重要机制之一。

在并发环境下,多个用户可以同时访问和修改数据库,因此需要一种机制来协调并管理这些并发操作,以避免数据混乱和不一致的情况。

ACID 属性

事务的 ACID 属性是指原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

这些属性确保了事务在执行时的可靠性和稳定性。

  1. 原子性(Atomicity): 事务被视为不可分割的最小操作单元。事务中的所有操作要么全部执行成功,要么全部回滚,即使系统崩溃也是如此。
  2. 一致性(Consistency): 事务在执行前后,数据库从一个一致的状态转换到另一个一致的状态。数据库约束和规则保证了数据的有效性和完整性。
  3. 隔离性(Isolation): 多个并发事务的执行是隔离的,每个事务对其他事务的操作都是透明的。隔离性防止了并发操作导致的数据不一致问题。
  4. 持久性(Durability): 一旦事务提交,其结果就会永久保存在数据库中,即使发生系统崩溃也不会丢失。

事务的状态

  1. 活动(Active): 事务正在执行中。
  2. 部分提交(Partially Committed): 事务的所有操作已经完成,但是事务还未完成提交。
  3. 失败(Failed): 事务执行过程中发生错误,导致无法继续执行。
  4. 中止(Aborted): 事务执行失败并被回滚,数据库恢复到执行事务前的状态。
  5. 提交(Committed): 事务成功执行并已提交,数据变更变为永久状态。

事务的控制

数据库事务可以使用以下几种控制语句来管理:

  1. BEGIN TRANSACTION: 用于开始一个新的事务。
  2. COMMIT: 用于提交事务,将事务中的操作永久保存到数据库。
  3. ROLLBACK: 用于回滚事务,撤销事务中的所有操作。
  4. SAVEPOINT: 用于在事务中创建一个保存点,允许在后续操作中部分回滚。
  5. SET TRANSACTION ISOLATION LEVEL: 用于设置事务的隔离级别,如读取未提交、已提交读等。

事务隔离级别

事务隔离级别定义了事务之间的可见性和影响范围。常见的隔离级别包括:

  1. 读未提交(Read Uncommitted): 事务可以读取其他事务未提交的数据,可能会出现脏读、不可重复读和幻读问题。
  2. 读已提交(Read Committed): 事务只能读取其他事务已提交的数据,可以避免脏读问题,但可能会出现不可重复读和幻读问题。
  3. 可重复读(Repeatable Read): 事务在同一事务中多次读取相同数据时保证结果一致,但仍可能出现幻读问题。
  4. 串行化(Serializable): 最高隔离级别,事务串行执行,避免了脏读、不可重复读和幻读问题,但降低了并发性能。

使用事务的注意事项

  1. 尽量缩短事务持续时间: 长时间的事务会锁定资源并降低并发性能。
  2. 避免在循环内部使用事务: 事务嵌套和嵌套提交可能会导致不可预料的问题。
  3. 注意死锁: 当多个事务相互等待对方释放资源时可能会发生死锁,需要使用锁超时和检测机制来解决。

总结

数据库事务是保障数据一致性和完整性的重要工具。

正确使用事务可以有效地管理并发操作,确保数据操作的准确性和可靠性。

在设计和实现数据库操作时,合理运用事务机制可以提高系统的可维护性和性能。

在 Go 中的使用

比较简单的代码,但是用法差不多

go

复制代码

func main() {
  // 连接数据库
  db, err := sql.Open("mysql", "user:password@tcp(host:port)/database")
  if err != nil {
    log.Fatal(err)
  }
  defer db.Close()
  // 开启事务
  tx, err := db.Begin()
  if err != nil {
    log.Fatal(err)
  }
  defer func() {
    if r := recover(); r != nil {
      tx.Rollback() // 回滚事务,避免悬挂事务
    }
  }()
  // 执行多个数据库操作,示例中是插入和更新操作
  _, err = tx.Exec("INSERT INTO users (name, age) VALUES (?, ?)", "Alice", 28)
  if err != nil {
    tx.Rollback() // 操作失败,回滚事务
    log.Fatal(err)
  }
  _, err = tx.Exec("UPDATE users SET age = ? WHERE name = ?", 29, "Alice")
  if err != nil {
    tx.Rollback() // 操作失败,回滚事务
    log.Fatal(err)
  }
  // 提交事务
  err = tx.Commit()
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println("Transaction completed successfully.")
}

参考链接

一篇讲透如何理解数据库并发控制(纯干货) - 知乎 (zhihu.com)Go 语言操作 MySQL 之 事务操作 - 知乎 (zhihu.com)Go语言操作MySQL | 李文周的博客 (liwenzhou.com)Golang如何优雅连接MYSQL数据库? - 知乎 (zhihu.com)


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
192 5
|
6月前
|
中间件 关系型数据库 Go
Go语言数据库编程:数据迁移与事务控制
本文介绍了《Go语言实战指南》中关于数据库编程的核心内容,涵盖使用 GORM 进行数据迁移与事务控制。主要内容包括:AutoMigrate 方法自动创建或更新表结构;事务控制的自动与手动实现方式;事务隔离级别的设置;以及在 Gin 框架中统一管理事务的实践建议。适合开发阶段的数据库结构管理和事务性操作需求。
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
|
SQL 数据库 数据安全/隐私保护
SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
【8月更文挑战第14天】解决SQL Server事务复制Log Reader作业因数据库所有者问题无法启动的方法:首先验证数据库所有者是否有效并具足够权限;若非,使用`ALTER AUTHORIZATION`更改为有效登录名。其次,确认Log Reader使用的登录名拥有读取事务日志所需的角色权限。还需检查复制配置是否准确无误,并验证Log Reader代理的连接信息及参数。重启SQL Server Agent服务或手动启动Log Reader作业亦可能解决问题。最后,审查SQL Server错误日志及Windows事件查看器以获取更多线索。
211 0
|
9月前
|
SQL 数据库 索引
【YashanDB数据库】大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks
大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks
|
存储 SQL 关系型数据库
数据库事务:确保数据完整性的关键20
【7月更文挑战第20天】事务是数据库操作的基本逻辑单位,确保数据一致性。ACID原则包括:原子性(操作全成或全败),一致性(事务前后数据合法性),隔离性(并发操作互不影响),持久性(提交后更改永久保存)。MySQL的InnoDB引擎支持事务,通过undo log实现回滚,redo log确保数据持久化。开启事务可使用`BEGIN`或`START TRANSACTION`,提交`COMMIT`,回滚`ROLLBACK`。
354 70
|
12月前
|
SQL 存储 Java
数据库———事务及bug的解决
事务的一些概念,并发事务以及并发事务引起的bug,脏读,不可重复读,幻读,数据库中的隔离级别,事务的简单应用
|
数据库
什么是数据库的事务隔离级别,有什么作用
【10月更文挑战第21】什么是数据库的事务隔离级别,有什么作用
198 3
|
存储 关系型数据库 数据挖掘
什么是数据库的事务隔离级别
【10月更文挑战第21】什么是数据库的事务隔离级别
358 1
|
存储 数据库 数据库管理
数据库事务安全性控制如何实现呢
【10月更文挑战第15天】数据库事务安全性控制如何实现呢

热门文章

最新文章