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

文章目录

  • 前言
  • 一、事务的基本概念
  • 二、ACID 特性
    • 1.原子性(Atomicity)
    • 2.一致性(Consistency)
    • 3.隔离性(Isolation)
    • 4.持久性(Durability)
  • 三、事务的操作
    • 1.开始事务(BEGIN TRANSACTION)
    • 2.提交事务(COMMIT)
    • 3.回滚事务(ROLLBACK)
  • 四、事务的隔离级别
    • 1.未提交读(Read Uncommitted)
    • 2.提交读(Read Committed)
    • 3.可重复读(Repeatable Read)
    • 4.串行化(Serializable)
  • 五、事务的并发控制机制
    • 1.锁机制
    • 2.多版本并发控制(MVCC,Multi-Version Concurrency Control)
  • 六、总结


前言

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


一、事务的基本概念

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

如:在银行系统中,从账户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 时间点对应的那个版本的数据,避免了不可重复读等问题,提高了并发性能,同时也在一定程度上保证了事务的隔离性。


六、总结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/61973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac苹果电脑 java前后端开发环境及软件安装教程

本文记录我初次使用macOS系统,m4 mini安装开发软件及环境的全过程,希望能帮助到你,好用的请点赞评论收藏增加热度,让更多Mac小白轻松体验开发,20241129 …

dfs—acwing

题目一&#xff1a;排序数字 842. 排列数字 - AcWing题库 分析 考虑dfs&#xff0c;其实stl——next_permutation也可以 路径存储开一个数组&#xff0c;不能重复搜索&#xff0c;加一个标记数组 代码 #include<bits/stdc.h> using namespace std;int path[10]; int…

一步一步写线程之十六线程的安全退出之一理论分析

一、多线程的开发 多线程的开发&#xff0c;在实际场景中几乎是无法避开的。即使是前端看似没有使用线程&#xff0c;其实在底层的框架中也使用了线程进行了支撑。至少到现在&#xff0c;不管是协程还是其它什么新的编程方式&#xff0c;仍然无法撼动线程的主流地位。 多线程的…

ISAAC SIM踩坑记录--添加第三方3D场景

ISAAC SIM仿真首先就是要有合适的3D场景&#xff0c;官方提供了一些场景&#xff0c;如果不能满足要求&#xff0c;那就只能自己建。 对于我这种不会3D建模的菜鸟&#xff0c;只能到网上下载了&#xff0c;sketchfab就是一个不错的平台&#xff0c;有不少免费资源可以下载。 …

人工智能_大模型091_大模型工作流001_使用工作流的原因_处理复杂问题_多轮自我反思优化ReAct_COT思维链---人工智能工作笔记0236

# 清理环境信息&#xff0c;与上课内容无关 import os os.environ["LANGCHAIN_PROJECT"] "" os.environ["LANGCHAIN_API_KEY"] "" os.environ["LANGCHAIN_ENDPOINT"] "" os.environ["LANGCHAIN_TRACING_V…

完全按照手册win10里装Ubuntu 虚拟机然后编译ESP32(主要是想针对ESP32C3和S3)开发板的鸿蒙系统(失败)

基本上完全按照手册来的&#xff0c;除了Ubuntu虚拟机使用了22.04 Jammy版本&#xff0c;鸿蒙手册里是20.04 版本&#xff0c;主要是鸿蒙里3年前的手册了&#xff0c;所以就擅自用了高版本。 据此还想到一点&#xff0c;鸿蒙LiteOS&#xff0c;还挺稳定的&#xff0c;3年也没有…

一文理解多模态大语言模型——下

作者&#xff1a;Sebastian Raschka 博士&#xff0c; 翻译&#xff1a;张晶&#xff0c;Linux Fundation APAC Open Source Evangelist 编者按&#xff1a;本文并不是逐字逐句翻译&#xff0c;而是以更有利于中文读者理解的目标&#xff0c;做了删减、重构和意译&#xff0c…

【Leetcode Top 100 - 扩展】328. 奇偶链表

问题背景 给定单链表的头节点 h e a d head head&#xff0c;将所有索引为奇数的节点和索引为偶数的节点分别组合在一起&#xff0c;然后返回重新排序的列表。 第一个 节点的索引被认为是 奇数 &#xff0c; 第二个 节点的索引为 偶数 &#xff0c;以此类推。 请注意&#xf…

使用伪装IP地址和MAC地址进行Nmap扫描

使用伪装IP地址和MAC地址进行Nmap扫描 在某些网络设置中&#xff0c;攻击者可以使用伪装的IP地址甚至伪装的MAC地址进行系统扫描。这种扫描方式只有在可以保证捕获响应的情况下才有意义。如果从某个随机的网络尝试使用伪装的IP地址进行扫描&#xff0c;很可能无法接收到任何响…

k8s 之 Role-Based Access Control

在 Kubernetes 中&#xff0c;RBAC&#xff08;Role-Based Access Control&#xff09;是一个用来控制对 Kubernetes 资源访问的授权机制。它通过定义不同角色&#xff08;Role&#xff09;和这些角色可以访问的权限&#xff0c;确保只有被授权的用户或服务能够执行特定的操作。…

什么是TCP的三次握手?

TCP的三次握手&#xff1a;深入理解建立可靠连接的过程 引言 在计算机网络中&#xff0c;传输控制协议&#xff08;TCP&#xff09;是确保数据可靠传输的核心协议之一。TCP通过三次握手机制来建立一个稳定的、双向的连接&#xff0c;这对于确保数据的完整性和顺序至关重要。本…

SpringBoot该怎么使用Neo4j - 优化篇

文章目录 前言实体工具使用 前言 上一篇中&#xff0c;我们的Cypher都用的是字符串&#xff0c;字符串拼接简单&#xff0c;但存在写错的风险&#xff0c;对于一些比较懒的开发者&#xff0c;甚至觉得之间写字符串还更自在快速&#xff0c;也确实&#xff0c;但如果在后期需要…

MySQL中on和where的区别

select name, bonus from Employee left join Bonus on Employee.EmpId Bonus.EmpId where bonus is null or bonus < 1000 作者&#xff1a;力扣官方题解 链接&#xff1a;https://leetcode.cn/problems/employee-bonus/ 来源&#xff1a;力扣&#xff08;LeetCode&#x…

数据科学与大数据之间的区别

什么是数据科学&#xff1f; 数据科学是一个跨学科领域&#xff0c;它将统计学和计算方法相结合&#xff0c;旨在从数据中提取见解和知识。它涉及收集、处理、分析以及解读数据&#xff0c;以揭示可用于为决策过程提供依据并推动创新的模式、趋势和关系。 数据科学涵盖了广泛…

neo4j如何存储关于liquidity structure的层次和关联结构

在 Neo4j 中存储关于流动性结构&#xff08;liquidity structure&#xff09;的层次和关联结构非常适合&#xff0c;因为 Neo4j 是一个基于图的数据库&#xff0c;能够自然地建模和存储复杂的关系和层次结构。下面是如何在 Neo4j 中设计和实现这样的数据模型的详细步骤和示例。…

七牛云成功保存但无法显示和访问{“error“:“download token not specified“}

在使用七牛云存储图片时&#xff0c;前端通过链接访问图片时遇到错误&#xff1a; {"error":"download token not specified"} 具体表现为&#xff1a; 后端通过 access_key 和 secret_key 生成了上传和下载的 Token。前端将域名与 res.key 拼接后生成图…

智慧银行反欺诈大数据管控平台方案(四)

智慧银行反欺诈大数据管控平台的核心内容&#xff0c;是通过整合多维度、多层次的金融交易信息&#xff0c;利用先进的大数据分析、机器学习与人工智能算法&#xff0c;构建一个系统性、实时性和智能化的反欺诈管控网络&#xff0c;旨在提供全面、高效、精准的风险评估机制。该…

jmeter基础_打开1个jmeter脚本(.jmx文件)

课程大纲 方法1.菜单栏“打开” 菜单栏“文件” - “打开” &#xff08;或快捷键&#xff0c;mac为“⌘ O”&#xff09;&#xff0c;打开文件选择窗口 - 选择脚本文件&#xff0c;点击“open”&#xff0c;即可打开脚本。 方法2.工具栏“打开”图标 工具栏点击“打开”图标&…

TCP编程案例

笔记&#xff1a;&#xff08;本题可能需要的&#xff09; TCP协议&#xff1a; TCP协议进行通信的两个应用进程&#xff1a;客户端、服务端。 使用TCP协议前&#xff0c;须先建立TCP连接&#xff0c;形成基于字节流的传输数据通道 传输前&#xff0c;采用“三次握手”方式…

静态链接的特点 ;动态链接的特点

1) 静态链接的特点 静态链接&#xff08;Static Linking&#xff09;是在程序编译时&#xff0c;将程序中使用的所有库函数和代码直接复制到最终生成的可执行文件中。其特点包括&#xff1a; 独立可执行文件&#xff1a;生成的可执行文件包含了程序运行所需的所有代码和数据&…