当前位置: 首页 > news >正文

事务的特性-原子性(Atomicity)、一致性(Consistency)、隔离性(Asolation)、持久性(Durability)

一、引言

1、数据库管理系统DBMS为保证定义的事务是一个逻辑工作单元,达到引入事务的目的,实现的事务机制要保证事务具有原子性、一致性、隔离性和持久性,事务的这四个特性也统称为事务的ACID特性

2、当事务保持了ACID特性,才能使数据库从一个一致性的状态转为另一个一致性的状态

3、数据库的一致性

  • 数据库的当前实例数据也称为数据库状态
  • 用户在数据库中的操作,主要是对数据库的状态值进行查询和更新,每个操作后的数据库状态,正是下一个操作的数据库的作用状态,也就是用户对数据库的操作使数据库从一个状态转变为另一个状态
  • 假设数据库的状态企业的当前业务状态相一致,是一个一致性状态,如果在事务执行过程中,硬件和软件都不出现错误,则事务执行结果不会产生不能解释的数据库状态值。数据库状态能反映用户对数据库的操作,则我们称事务使数据库保持一致性,数据库处于一致性状态

4、数据库可能会在事务执行过程的某一时刻处于不一致的状态,但在事务结束后应处于一致性状态 

二、原子性(Atomicity)

1、 事务的原子性是指事务作为数据库系统的逻辑工作单元,事务中的所有数据库操作是不可分割的

2、事务必须作为整体执行或根本不执行,即事务中包括的所有操作,要么都执行完,要么就根本没有执行,事务的这种“全或无”的特性,称为事务的原子性

3、事务的原子性要求每个事务要么提交,要么因异常终止而回滚。如果事务没有执行完成,其结果就像它根本没有执行一样。

对于该银行转账事务,事务的原子性要求,要么从账户A支出1000元存入账户B中,要么没有从账户A支出,账户B也没有进账,而不能只从账户A支出却没有存入账户B中。

若从账户A支出1000元,但在存入账户B前,事务夭折,比如强行终止事务。可看出终止事务前已从A账户中支出1000元,但还没有存入账户B中

begin transaction
select * from accounts;update accounts
set balance=balance-1000
where acctNo='A'; /* 从账户A中减去1000元 */select * from accounts;

终止事务后,事务不能继续执行 ,前面执行的所有更新操作结果也被DBMS撤销了,数据库中数据的值为事务执行前的值

select * from accounts;

三、一致性(Consistency)

1、事务的一致性是指事务从一个一致的数据库状态开始独立地执行,则事务结束时,数据库也必须再次处于一致性状态,即事务必须保证数据库的一致性

  • 这种一致性不仅包括要满足数据库设计者指定的完整性约束
  • 还要正确反映事务成功提交的结果,使数据库的状态与企业状态一致

对于这个银行转账事务,事务的一致性要求事务的执行不能改变账户A和账户B的资金总额,即应用程序员在编写事务时要确保账户A的支出和账户B存入的资金相等。同时如果数据库设计时要求不能透支转账,即当事务执行的时候,从账户A支出1000元后余额小于0,则事务的执行应该被阻止,满足数据库的完整性约束 

set xact_abort  ON;
begin transaction;select * from accounts;update accounts
set balance=balance-1000
where acctNo='A';   /* 从账户A中减去1000元*/update accounts
set balance=balance+1000
where acctNo='B';   /* 从账户B中加上1000元*/select * from accounts;commit;

2、确保单个事务的一致性是编写该事务的应用程序员的职责,可通过定义一致性约束,来阻止任何违反约束的事务的执行

SET XACT_ABORT ON;

 这一行时针对SQL Server数据库的一个设置命令,用于控制事务处理中的错误处理行为,当 XACT_ABORT设置为ON是,它会影响SQL Server在事务中遇到错误时的行为

(1)即时终止:当一个错误发生时(比如约束冲突、数据类型不匹配等),当前批处理将立即停止执行,而不仅仅在遇到错误的语句上停止。这意味着即是错误发生在事务中间,后续的SQL语句也不会被执行

(2)自动回滚:在批处理因错误终止时,如果当前处于事务中,这个事务会自动被自动回滚,回归到事务开始签的状态,确保数据的一致性

(3)减少不确定状态:使用SET XACT_ABORT ON可以减少数据库中因部分事务执行而可能导致的数据不一致问题,因为它确保了要么整个事务成功,要么完全不改变数据库状态

四、隔离性(Asolation)

1、隔离性是事务在并发执行时应具有的特性。如同在操作系统中允许多个进程并发执行来提高系统资源的利用率一样

2、在多用户的现代数据库系统中,系统有能力同时并发执行多个事务,来提高系统的事务吞吐量,减少事务等待时间充分发挥数据库共享资源的特点

3、一个事务可能同时包含多个数据库操作,多个事务同时并发执行,则不同事务间的数据库操作可能会交错执行并可能对同一个数据库对象进行操作 

事务作为一个逻辑工作单元,在用户看起来,事务内的操作是不能被其他不属于该事务的数据库操作分隔开的

4、事务的隔离性就是指一个事务正常执行不被来自并发执行的事务中的数据库操作所干扰的特性

5、每个事务都应感觉不到系统中有其他事务在并发地执行

比如大家经常会在12306网站订票,甚至是抢票,我们的每个预定操作对系统来说就是一个并发的事务,系统会保证事务间的隔离性,当两个人分别用手机登录自己的账户同时抢同一车次的一张余票时,只会让一个人预定到,而在数据库管理系统没有实现事务机制前,则可能会出现两个人抢到同一座位的情况

五、持久性(Durability)

1、事务的持久性也称永久性

2、是指一个事务一旦提交,它对数据库中数据的更新就应持久地保存在数据库中

3、后序的其他操作或系统故障等,不应该其执行结果有任何影响

对于银行转账事务,事务的持久性要求当事务提交后,即客户确认转账成功并离开,不管银行的操作计算机或存放数据库的磁盘出现任何故障,都不会引起与这次转账相关的数据丢失

set xact_abort  ON;
begin transaction;select * from accounts;update accounts
set balance=balance-1000
where acctNo='A';   /* 从账户A中减去1000元*/update accounts
set balance=balance+1000
where acctNo='B';   /* 从账户B中加上1000元*/select * from accounts;commit;select * from accounts;

六、小结

执行的事务保持ACID特性是数据库保持一致性的前提,由于并发执行的事务会破坏事务的隔离性,系统出现的各类故障会破坏事务的原子性和持久性,数据库管理提供DBMS必须对事务进行处理,对并发执行的事务进行并发控制,保证事务的隔离性,对发生故障后系统中的事务更新结果进行恢复保证事务的原子性和持久性。此外,利用DBMS的完整性约束机制,保证事务的一致性 

相关文章:

事务的特性-原子性(Atomicity)、一致性(Consistency)、隔离性(Asolation)、持久性(Durability)

一、引言 1、数据库管理系统DBMS为保证定义的事务是一个逻辑工作单元,达到引入事务的目的,实现的事务机制要保证事务具有原子性、一致性、隔离性和持久性,事务的这四个特性也统称为事务的ACID特性 2、当事务保持了ACID特性,才能…...

redis哨兵模式(Redis Sentinel)

哨兵模式的背景 当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式。 为了解决单点故障和提高系统的可用性,需要一种自动化的监…...

【牛客】牛客小白月赛97 题解 A - E

文章目录 A - 三角形B - 好数组C - 前缀平方和序列D - 走一个大整数迷宫E - 前缀和前缀最大值 A - 三角形 map存一下每个数出现了多少次&#xff0c;再遍历map #include <bits/stdc.h>using namespace std;#define int long long using i64 long long;typedef pair<…...

Spring Boot中泛型参数的灵活运用:最佳实践与性能优化

泛型是Java中一种强大的特性&#xff0c;它提供了编写通用代码的能力&#xff0c;使得代码更加灵活和可复用。在Spring Boot应用程序中&#xff0c;泛型参数的灵活运用可以带来诸多好处&#xff0c;包括增强代码的可读性、提高系统的健壮性以及优化系统的性能。本文将深入探讨在…...

MySQL建表时的注意事项

以下是我对MySQL建表时的注意事项。其实&#xff0c;建表事项有很多&#xff0c;我的总结如下&#xff1a; 1 存储引擎的选择&#xff0c;一般做开发&#xff0c;都是要支持事务的&#xff0c;所以选择InnoDB 2 对字段类型的选择&#xff1a; ​ 对于日期类型如果要记录时分…...

Advanced RAG 09:『提示词压缩』技术综述

编者按&#xff1a; 如何最大限度地发挥 LLMs 的强大能力&#xff0c;同时还能控制其推理成本&#xff1f;这是当前业界研究的一个热点课题。 针对这一问题&#xff0c;本期精心选取了一篇关于"提示词压缩"(Prompt Compression)技术的综述文章。正如作者所说&#xf…...

(13)DroneCAN 适配器节点(二)

文章目录 前言 2 固件 2.1 基于F103 2.2 基于F303 2.3 基于F431 3 ArduPilot固件DroneCAN设置 3.1 f303-通用设置示例 4 DroneCAN适配器节点 前言 这些节点允许现有的 ArduPilot 支持的外围设备作为 DroneCAN 或 MSP 设备适应 CAN 总线。这也允许扩展自动驾驶仪硬件的…...

摸鱼大数据——Spark基础——Spark环境安装——Spark Local[*]搭建

一、虚拟机配置 查看每一台的虚拟机的IP地址和网关地址 查看路径: cat /etc/sysconfig/network-scripts/ifcfg-ens33 2.修改 VMware的网络地址: 使用VMnet8 3.修改windows的对应VMware的网卡地址 4.通过finalshell 或者其他的shell连接工具即可连接使用即可, 连接后, 测试一…...

函数内部结构分层浅析(从MVC分层架构联想)

函数内部结构分层浅析&#xff08;从MVC分层架构联想&#xff09; 分层架构:一种将软件代码按不同功能进行划分的架构模式。 优点包括&#xff1a; 可维护性&#xff1a;各层职责明确&#xff0c;易于单独修改维护。 可扩展性&#xff1a;方便添加或修改某一层&#xff0c;不…...

【three.js案例二】时空隧道

import * as THREE from ./build/three.module.js // 引入轨道控制器扩展库OrbitControls.js import { OrbitControls } from three/addons/controls/OrbitControls.js; // 引入dat.gui.js的一个类GUI import { GUI } from three/addons/libs/lil-gui.module.min.js;// 场景 co…...

动手学深度学习(Pytorch版)代码实践 -计算机视觉-48全连接卷积神经网络(FCN)

48全连接卷积神经网络&#xff08;FCN&#xff09; 1.构造函数 import torch import torchvision from torch import nn from torch.nn import functional as F import matplotlib.pyplot as plt import liliPytorch as lp from d2l import torch as d2l# 构造模型 pretrained…...

【Python游戏】猫和老鼠

本文收录于 《一起学Python趣味编程》专栏,从零基础开始,分享一些Python编程知识,欢迎关注,谢谢! 文章目录 一、前言二、代码示例三、知识点梳理四、总结一、前言 本文介绍如何使用Python的海龟画图工具turtle,开发猫和老鼠游戏。 什么是Python? Python是由荷兰人吉多范…...

【无标题】c# WEBAPI 读写表到Redis

//c# WEBAPI 读写表到Redis using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using Newtonsoft.Json; using StackExchange.Redis; using System.Data; using System.Web; namespace …...

【剑指Offer系列】53-0到n中缺失的数字(index)

给定一个包含 [0, n] 中 n 个数的数组 nums &#xff0c;找出 [0, n] 这个范围内没有出现在数组中的那个数。 示例 1&#xff1a; 输入&#xff1a;nums [3,0,1] 输出&#xff1a;2 解释&#xff1a;n 3&#xff0c;因为有 3 个数字&#xff0c;所以所有的数字都在范围 [0,3]…...

docker compose部署zabbix7.0官方方法快速搭建

环境介绍&#xff1a; 系统&#xff1a;centos7 官方文档&#xff1a;https://www.zabbix.com/documentation/current/zh/manual/installation/containers docker镜像加速 vi /etc/docker/daemon.json{"registry-mirrors": ["https://docker.1panel.live&quo…...

分库分表之后如何设计主键ID(分布式ID)?

文章目录 1、数据库的自增序列步长方案2、分表键结合自增序列3、UUID4、雪花算法5、redis的incr方案总结 在进行数据库的分库分表操作后&#xff0c;必然要面临的一个问题就是主键id如何生成&#xff0c;一定是需要一个全局的id来支持&#xff0c;所以分库分表之后&#xff0c;…...

秋招突击——6/28、6.29——复习{数位DP——度的数量}——新作{}

文章目录 引言复习数位DP——度的数量个人实现参考实现 总结 引言 头一次产生了那么强烈的动摇&#xff0c;对于未来没有任何的感觉的&#xff0c;不知道将会往哪里走&#xff0c;不知道怎么办。可能还是因为实习吧&#xff0c;再加上最近复习也没有什么进展&#xff0c;并不知…...

Spring Boot中使用Thymeleaf进行页面渲染

Spring Boot中使用Thymeleaf进行页面渲染 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Spring Boot应用中使用Thymeleaf模板引擎进行页面…...

恢复策略(下)-事务故障后的数据库恢复、系统故障后的数据库恢复(检查点技术)、介质故障后的数据库恢复

一、数据库恢复-事务故障 系统通过对事物进行UNDO操作和REDO操作可实现故障后的数据库状态恢复 1、对于发生事务故障后的数据库恢复 恢复机制在不影响其他事务运行的情况下&#xff0c;强行回滚夭折事务&#xff0c;对该事务进行UNDO操作&#xff0c;来撤销该事务已对数据库…...

如何知道docker谁占用的显卡的显存?

文章目录 python环境安装nvidia-htop查看pid加一个追踪总结一下【找到容器创建时间】使用说明示例 再总结一下【用PID找到容器创建时间&#xff0c;从而找到谁创建的】使用说明示例 python环境安装nvidia-htop nvidia-htop是一个看详细的工具。 pip3 install nvidia-htop查看…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...