首页 > 数据库 >一文解决数据库【事务】相关问题

一文解决数据库【事务】相关问题

时间:2024-12-04 23:00:25浏览次数:10  
标签:事务 一文 数据库 并发 提交 数据 隔离

文章目录


前言

学习事务对于理解数据库的操作和数据的完整性维护非常重要,无论是开发数据库应用程序还是进行数据库管理,都需要深入掌握事务的相关知识。


一、事务的基本概念

事务是一组数据库操作的集合,这些操作要么全部成功执行,要么全部不执行。

如:在银行系统中,从账户A转账到账户B,包括从账户A扣除金额和在账户B增加金额这两个操作。这两个操作应该作为一个整体来执行,不能出现只扣除了金额却没有增加金额或者反之的情况。


二、ACID 特性

A、C、I、D这四个字母各代表一种特性

1.原子性(Atomicity)

原子性要求事务中的所有操作要么全部完成,要么全部不完成。就像一个不可分割的原子一样。如果在事务执行过程中发生错误,那么已经执行的部分操作会被回滚,就像整个事务从未发生过。

如果没有这一特性,比如在转账时,收款方网络可能一时不佳,没能成功收款,结果转账方钱发过去了,收款方却没拿到。


2.一致性(Consistency)

事务必须使数据库从一个一致状态转换到另一个一致状态。

如:在两个人相互转账的过程中(不考虑额外支出)两个人的总金额应该与原来保持一致。


3.隔离性(Isolation)

多个事务并发执行时,一个事务的执行不能被其他事务干扰。每个事务都应该感觉不到其他事务的存在。

如:一个人在向外转账的同时收款,这两个动作应该互不影响。


4.持久性(Durability)

一旦事务提交,它对数据库中数据的改变就应该是永久性的,通过数据库的日志和备份恢复机制来实现。

如:你在收款之后,不能因为你重启了一下应用,就把你之前收的钱退回去了。


三、事务的操作

1.开始事务(BEGIN TRANSACTION)

这是事务的起始标志,这个操作会开启一个新的事务环境,之后的数据库操作都将在这个事务的范围内执行,直到事务被提交或者回滚。


2.提交事务(COMMIT)

当事务中的所有操作都成功完成,并且满足业务规则和数据一致性要求时,使用COMMIT语句来提交事务。提交事务会使事务中对数据库的所有修改永久生效(持久性)。

如:在完成了一次正确的转账操作后,使用COMMIT将转账的修改(扣除和增加金额)保存到数据库中。


3.回滚事务(ROLLBACK)

如果在事务执行过程中出现错误,或者某些操作违反了业务规则、数据一致性等要求,可以使用ROLLBACK语句将事务回滚。回滚会撤销事务中已经执行的所有操作,使数据库恢复到事务开始之前的状态。

如:在转账过程中,如果收款方出现异常,会把钱退还回去,不会把钱吞掉。


四、事务的隔离级别

事务隔离级别是数据库管理系统为了处理多个事务并发执行时可能出现的数据不一致问题而设定的规则。通过设置不同的隔离级别来保证一致性和隔离性。

1.未提交读(Read Uncommitted)

字面意思:可以读其他未提交的事务的数据,这是最低的隔离级别。在这个级别下,一个事务可以读取另一个事务尚未提交的数据。这种情况就好像事务之间的操作是完全透明的,没有任何隔离措施来阻止一个事务查看其他事务正在进行的修改。

缺点: 脏读


2.提交读(Read Committed)

字面意思:可以读已提交的事务的数据,比未提交读高一级的隔离级别。在提交读隔离级别下,一个事务只能读取其他事务已经提交的数据。这样就避免了脏读问题,因为事务必须等待其他事务提交修改后才能读取到最新的数据。

缺点:不可重复读


3.可重复读(Repeatable Read)

在可重复读隔离级别下,一个事务在执行期间多次读取同一数据时,其结果是一样的,不会受到其他事务提交修改的影响。这个级别通过某种机制(如在数据库中使用行级锁或版本控制)来确保在一个事务内部,数据的读取是稳定的。

缺点:幻读


4.串行化(Serializable)

这是最高的隔离级别。在串行化隔离级别下,事务会被串行执行,就好像每个事务是在一个单独的环境中依次运行一样。这样完全避免了脏读、不可重复读和幻读等所有并发问题,因为根本不存在事务并发执行的情况。


五、事务的并发控制机制

1.锁机制

共享锁(Shared Lock,S Lock):也叫读锁。多个事务可以同时对同一数据对象加共享锁,用于只读操作。例如,多个事务都只是查询某条产品信息记录时,可以同时获得该记录的共享锁,互不干扰。但如果有事务已经对该数据对象加了共享锁,其他事务想要加排他锁(用于修改数据)就需要等待共享锁释放后才能进行。

排他锁(Exclusive Lock,X Lock)当一个事务对某数据对象加排他锁后,只有该事务可以对这个数据对象进行读写操作,其他事务不能再对其加任何锁,直至该排他锁被释放。 比如在修改用户账户余额时,要先对账户记录加排他锁,防止其他事务同时修改该余额,保证数据修改的准确性和一致性。


2.多版本并发控制(MVCC,Multi-Version Concurrency Control)

这是一种并发控制的方法,主要用于解决读写冲突问题,在一些数据库系统(如 MySQL 的 InnoDB 引擎)中广泛应用。其核心思想是,数据库为每个数据行维护多个版本,不同事务在读取数据时可以根据一定规则读取相应版本的数据,而不用等待其他事务释放锁。 例如,事务 A 在时间点 T1 读取了某数据的一个版本,之后事务 B 修改了该数据并提交,当事务 A 再次读取该数据(在事务 A 未结束期间),它依然能读取到之前 T1 时间点对应的那个版本的数据,避免了不可重复读等问题,提高了并发性能,同时也在一定程度上保证了事务的隔离性。


六、总结

事务包含的操作数量尽量不要过大。一个事务中如果包含大量复杂的操作,一方面执行时间会变长,长时间占用数据库资源,可能会影响其他事务的并发执行;另一方面,出现错误需要回滚时,回滚成本也会很高。

串行化隔离级别虽然能最大程度保证数据的一致性,避免各种并发问题,但会严重限制并发性能,因为事务只能串行执行。而未提交读隔离级别虽然并发性能高,但容易出现脏读等数据问题。因此要选择合适的隔离级别。

标签:事务,一文,数据库,并发,提交,数据,隔离
From: https://blog.csdn.net/bufangbufang/article/details/144222259

相关文章

  • 【分布式技术】一文讲透链路追踪
    链路追踪详细讲解概述一、定义与核心思想二、关键概念三、实现方式四、应用场景五、常用工具六、发展趋势与挑战设计原型Dapper一、基本概念与原理二、主要功能三、使用步骤四、系统特点五、应用场景六、优势与挑战什么是MDC一、MDC的基本用法二、在日志配置文件中使用......
  • 【python】数据库编程
    【python】数据库编程什么是数据库MySQL安装启动MySQL数据库pymysql库基础操作SQL语言基础示例Python作为一种多功能的编程语言,在数据库操作方面展现出了卓越的灵活性和强大的功能。无论你是初涉编程领域的数据爱好者,还是经验丰富的开发者寻求优化数据库交互方案......
  • Java 中几种常用的数据库访问技术
    摘要: 本文深入探讨了Java中几种常用的数据库访问技术,包括JDBC、Hibernate、MyBatis等。详细阐述了每种技术的基本原理、核心组件、使用方法,并通过丰富的示例代码展示了它们在实际应用中的数据库交互操作。通过对这些技术的学习,读者能够全面了解Java与数据库交互的多种途......
  • windows系统下 重置mysql数据库的密码
    停掉mysql服务win+x按a进入管理员cmd,输入netstopmysql(mysql是服务名,不清楚的可以在服务中查看)2.输入mysqld爆红进入mysql安装目录输入./mysqld--console--skip-grant-tables报错要加入数据目录地址,输入.\mysqld--console--datadir="D:\Deve......
  • hhdb数据库介绍(10-36)
    管理分片方案在线变更提供对业务表的表类型、分片规则、分片字段、分片所属数据节点四个维度进行在线变更的支持。业务表在变更期间不会锁表,业务可对表进行正常的IUD操作。分片方案在线变更记录页面显示已执行完成或正在执行的变更任务记录,正在变更的任务允许通过【取消执......
  • 数据库管理与开发基础教程复习(二)
    Oraclec常用工具简单介绍:SQL*PLUS由开始菜单启动和命令行启动企业管理器OEMOracle数据库集成管理平台SOLPLUS常用命令连接与断开数据库连接命令:-connect-disconnect查看表结构命令:describe(desc)SOL*PLUS环境参数设置命令-set-arraysize-linesize-pagesize......
  • 14_基于springboot的图书管理系统(代码+数据库+文档)
    ......
  • 数据库视图部分
    一、创建视图的目的   简单隐藏数据复杂性   安全可以对视图授权   数据独立可以屏蔽表结构变化对用户的影响一、创建视图的目的,比如增加列,更改列名二、创建视图   1.创建单表视图    以下视图显示JAVA班的学生姓名、身份证号和班......
  • 想考项目管理PMP?一文带你了解如何高效备考
    PMP(ProjectManagementProfessional)是由美国项目管理协会(PMI)推出的项目管理专业人士认证考试,是全球认可的项目管理认证之一,对于从事项目管理或计划转型为项目管理的人士来说,是一项非常重要的职业资质。那么在正式备考和考试之前,你需要了解哪些信息,又该如何准备呢?这篇文章将为你全......
  • 关系模型(数据库)
    1. Basic Conception\textbf{1.BasicConception}......