【什么是事务?】

ops/2024/12/22 15:34:47/

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

 原子性(Atomicity)

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

 一致性(Consistency)

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

 隔离性(Isolation)

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

 持久性(Durability)

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

隔离性的重要性

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

脏读(Dirty Read)

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

不可重复读(Nonrepeatable Read)

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

幻读(Phantom Read)

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

事务隔离级别

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

  1. 读未提交(Read Uncommitted)

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

  2. 读已提交(Read Committed)

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

  3. 可重复读(Repeatable Read)

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

  4. 串行化(Serializable)

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

隔离级别与系统性能

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


http://www.ppmy.cn/ops/144056.html

相关文章

金碟中间件-AAS-V10.0安装

金蝶中间件AAS-V10.0 AAS-V10.0安装 1.解压AAS-v10.0安装包 unzip AAS-V10.zip2.更新license.xml cd /root/ApusicAS/aas# 这里要将license复制到该路径 [rootvdb1 aas]# ls bin docs jmods lib modules templates config domains …

怎样衡量电阻负载的好坏

电阻负载的好坏通常通过以下几种方法来衡量: 1. 测量电阻值:最直接的方法是使用万用表来测量电阻负载的电阻值。将万用表设置在适当的电阻档位,然后将测试笔连接到电阻负载的两个引脚上。如果电阻负载是好的,那么万用表应该显示一…

配置PostgreSQL用于集成测试的步骤

在进行软件开发时,集成测试是确保各个组件能够协同工作的关键环节。PostgreSQL作为一种强大的开源数据库系统,常被用于集成测试中。下面将详细介绍如何在不同的环境中配置PostgreSQL以支持集成测试。 1. 选择并安装PostgreSQL 首先,你需要根…

skyler实战渗透笔记—Kioptrix-1

0x00 前言 This Kioptrix VM Image are easy challenges. The object of the game is to acquire root access via any means possible (except actually hacking the VM server or player). The purpose of these games are to learn the basic tools and techniques in vuln…

Java进程占用的内存有哪些部分?

大家好,我是锋哥。今天分享关于【Java进程占用的内存有哪些部分?】面试题。希望对大家有帮助; Java进程占用的内存有哪些部分? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java进程在运行时,会将内存划分为多个区域&#xf…

STM32-笔记5-按键点灯(中断方法)

1、复制03-流水灯项目,重命名06-按键点灯(中断法) 在\Drivers\BSP目录下创建一个文件夹exti,在该文件夹下,创建两个文件exti.c和exti.h文件,并且把这两个文件加载到项目中,打开项目工程文件 加载…

鸿蒙审核版本页面显示异常之混淆代码问题

鸿蒙审核版本页面显示异常之混淆代码问题 参考文档 代码写的好好的,真机测试也运行的好好的,高高兴兴的提测去了。都填好了之后就等着测试结果了。 等了半天收到了一个页面无法展示的评审意见。啊,难道是测试的网络有问题?还是…

C++ 面向对象编程

面向对象编程(Object-Oriented Programming, OOP)是C语言的一个重要特性,它允许开发者以更直观和模块化的方式来设计和构建程序。OOP的四个主要原则是:封装(Encapsulation)、继承(Inheritance&a…