什么是事务

server/2024/12/24 7:31:14/

数据库管理系统中,事务(Transaction)是执行一系列操作的最小工作单元,这些操作要么全部成功,要么全部失败。为了确保数据的一致性和完整性,事务被设计为具备四大特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),通常简称为ACID。下面将详细介绍这四个特性。

 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单元,事务中的操作要么全部执行,要么全部不执行。换句话说,事务在执行过程中,如果发生任何错误或异常,事务中的已执行操作必须被撤销,使数据库状态恢复到事务开始之前的状态,就像这个事务从未执行过一样。原子性确保了数据库状态的完整性,防止了部分操作成功、部分操作失败导致的数据库不一致。

 一致性(Consistency)
一致性是指事务执行前后,数据库的完整性约束没有被破坏。这意味着事务在执行过程中,必须保证数据库从一个一致性状态转变到另一个一致性状态。一致性约束了数据库状态的变化,确保事务执行后数据库中的所有数据都满足业务规则、完整性约束和触发器等条件。如果事务在执行过程中违反了这些约束,事务将被终止,数据库状态将回滚到事务开始之前的状态。

 隔离性(Isolation)
隔离性是指多个事务在并发执行时,它们之间的操作是相互隔离的,互不干扰。这意味着一个事务的内部操作对其他并发事务是不可见的,直到该事务提交。隔离性确保了事务的并发执行不会导致数据不一致。为了实现隔离性,数据库系统通常会采用锁机制、时间戳排序或乐观并发控制等技术。不同的隔离级别(如读未提交、读已提交、可重复读和串行化)提供了不同程度的隔离性保障。

 持久性(Durability)
持久性是指一旦事务提交,其对数据库的影响将是永久性的,即使系统崩溃或断电,这些影响也不会丢失。持久性确保了事务在提交后,其修改的数据被永久地保存在数据库中,不会因为系统故障而丢失。为了实现持久性,数据库系统通常会将事务的修改记录到持久存储介质(如磁盘)上,并在事务提交时确保这些记录被成功写入。

隔离性的重要性
隔离性是指数据库提供一定的隔离机制,使得多个并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。然而,不同的隔离级别决定了事务隔离性的独立程度。如果隔离的不够好,可能会产生脏读、不可重复读和幻读等问题。

脏读(Dirty Read)
脏读是指一个事务读取了另一个事务未提交的更新结果。如果未提交的事务最终回滚,那么读取到的数据就是无效的,即脏数据。脏读会导致数据不一致。

不可重复读(Nonrepeatable Read)
不可重复读是指同一个事务在事务过程中多次读取同一个数据,得到的结果不同。这通常发生在另一个事务在第一次读取和第二次读取之间更新了该数据。

幻读(Phantom Read)
幻读是指一个事务在多次执行相同的查询时,由于其他事务在查询范围内插入了新记录,导致查询结果不一致。

事务隔离级别
为了解决上述并发访问问题,SQL标准定义了四种事务隔离级别,从低到高分别是:

读未提交(Read Uncommitted)

这是最低的隔离级别。在这种级别下,一个事务可以读取另一个事务未提交的更新结果。这种级别最容易产生脏读问题,因为读取的数据可能是无效的。

读已提交(Read Committed)

这是SQL Server的默认隔离级别。在这种级别下,一个事务只能读取另一个事务已经提交的更新结果。这种级别可以避免脏读问题,但仍可能出现不可重复读和幻读问题。

可重复读(Repeatable Read)

这是MySQL的默认隔离级别。在这种级别下,同一个事务在多次读取同一数据时,得到的结果是一致的。这解决了脏读和不可重复读问题,但仍可能产生幻读问题。为了实现这一点,数据库会在事务期间对读取的记录加锁,防止其他事务修改这些记录。

串行化(Serializable)

这是最高的隔离级别。在这种级别下,事务按序列化的方式执行,每个事务执行时,数据库会将该事务的所有操作按顺序排队执行,对其他事务的访问进行阻塞。这种级别避免了所有并发问题(脏读、不可重复读和幻读),但代价是牺牲了系统的并发性。

隔离级别与系统性能
需要注意的是,隔离级别与系统并发性成反比,与数据一致性成正比。较高的隔离级别可以提供更强的数据一致性保障,但会降低系统的并发性。因此,在选择隔离级别时,需要根据具体的业务需求进行权衡。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/2401_87476016/article/details/144628770


http://www.ppmy.cn/server/152706.html

相关文章

Retrofit源码分析:动态代理获取Api接口实例,解析注解生成request,线程切换

目录 一,Retrofit的基本使用 1.定义api接口 2.创建Retrofit实例 3.获取api接口实例发起请求 二,静态代理和动态代理 1,静态代理 2,动态代理 三,动态代理获取Api接口实例 四,解析接口方法注解&…

解锁 GitBook 的奥秘:从入门到精通之旅

一、GitBook 初印象 在当今数字化时代,知识的传播与分享变得愈发便捷和多样化。GitBook 作为一款强大的文档编辑与电子书制作工具,正逐渐崭露头角,为广大创作者、开发者和知识爱好者提供了一个高效且灵活的平台。它不仅仅是一个简单的文档编写…

拓展AI超级智能后的人类生活场景

一、日常生活领域 (一)家居生活 在AI超级智能拓展之后,家居生活将发生翻天覆地的变化。清晨,当第一缕阳光透过智能窗帘的缝隙照进房间时,智能管家已经根据主人的生物钟和当天的日程安排,轻柔地播放起舒缓的…

重温设计模式--单例模式

文章目录 单例模式(Singleton Pattern)概述单例模式的实现方式及代码示例1. 饿汉式单例(在程序启动时就创建实例)2. 懒汉式单例(在第一次使用时才创建实例) 单例模式的注意事项应用场景 C代码懒汉模式-经典…

图像处理基础 | 格式转换.rgb转.jpg 灰度图 python

一般情况下 .rgb 格式的存储顺序: 颜色顺序: 一般情况下,.rgb 文件存储的是原始的 RGB 数据(而不是 BGR 数据)。即每个像素是由 R(红色)、G(绿色)、B(蓝色&…

SQL server学习10-数据库编程(中)

目录 一,分支语句 IF...ELSE 二,多路分支函数 CASE 1,简单CASE函数 2,CASE搜索函数 三,循环语句 WHILE 四,检测语句 IF...EXISTS T-SQL语言中提供了丰富的流程控制语句或函数,主要包含 分…

在Linux上将 `.sh` 脚本、`.jar` 包或其他脚本文件添加到开机自启动

在Linux上将 .sh 脚本、.jar 包或其他脚本文件添加到开机自启动 在Linux环境中,有时需要将一些程序、脚本或应用程序设置为开机时自动启动。这对于那些需要在系统启动时启动的服务或应用非常有用。本文将介绍如何将 .sh 脚本、.jar 包或其他脚本文件添加到Linux系统…

单元测试mock框架Mockito

为了继续改进 Mockito 并进一步改善单元测试体验,我们希望您升级到 2.1.0!Mockito 遵循语义版本控制,仅在主要版本升级时包含重大更改。在库的生命周期中,重大更改是推出一组全新功能所必需的,这些功能会改变现有行为甚…