首页 > 其他分享 >【DB】事务及ACID

【DB】事务及ACID

时间:2022-08-29 11:25:17浏览次数:68  
标签:事务 读取 T2 DB T1 修改 ACID 数据

一、事务

事务是指:由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和,构成一个完整的逻辑过程,不可拆分。这个过程被称为一个事务,具有ACID特性。ACID的概念在ISO/IEC 10026-1:1992文件的第四段內有所說明。

 

ACID,是指数据库管理系统(DBMS)在写入或更新資料的过程中,为保证事务(transaction)是正确可靠的,所必須具备的四个特性:

原子性(Atomicity)、

一致性(Consistency)、

隔离性(Isolation)、

持久性(Durability)。

 

 

  • 原子性(Atomicity):

一個事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。回滚可以用回滚日志(Undo Log)来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。

  • 一致性(Consistency):

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。

  • 隔离性(Isolation):

数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。

  • 持久性(Durability):

事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

 

事务的 ACID 特性概念简单,但不是很好理解,主要是因为这几个特性不是一种平级关系:

  • 只有满足一致性,事务的执行结果才是正确的。
  • 在无并发的情况下,事务串行执行,隔离性一定能够满足。此时只要能满足原子性,就一定能满足一致性。
  • 在并发的情况下,多个事务并行执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。
  • 事务满足持久化是为了能应对系统崩溃的情况。

二、并发一致性问题

在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题。

丢失修改

丢失修改指一个事务的更新操作被另外一个事务的更新操作替换。

一般在现实生活中常会遇到,例如:T1 和 T2 两个事务都对一个数据进行修改,T1 先修改并提交生效,T2 随后修改,T2 的修改覆盖了 T1 的修改。

读脏数据

读脏数据指在不同的事务下,当前事务可以读到另外事务未提交的数据。

例如:T1 修改一个数据但未提交,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。

不可重复读

不可重复读指在一个事务内多次读取同一数据集合。在这一事务还未结束前,另一事务也访问了该同一数据集合并做了修改,由于第二个事务的修改,第一次事务的两次读取的数据可能不一致。

例如:T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。

幻影读

幻读本质上也属于不可重复读的情况,

T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。

 

参考

<ACID - 维基百科,自由的百科全书 (wikipedia.org)>

<CS-Notes/数据库系统原理.md at master · CyC2018/CS-Notes (github.com)>

标签:事务,读取,T2,DB,T1,修改,ACID,数据
From: https://www.cnblogs.com/TonyZhao/p/16635265.html

相关文章

  • mongdb
    mongo笔记mongodb插入数据db.collection.insert({})//插入数据,_id存在会报错db.collection.save({})//插入数据,但_id存在会更新mongodb的更新操作db.colle......
  • mysql导入.idb文件进行修复数据库
    背景:数据库在运行过程中出现了问题,需要根据*.idb文件进行找回数据操作步骤:1)先创建一个同样数据格式的表(之前存在的话备份删除,最好先在新的数据库中走一遍流程)--......
  • ModBus Slave和Poll
    Poll模拟上位机,Slave模拟从站 01、03为可读可写,02、04为只读,通常基于01、03开发......
  • 【DB】存储过程
    1。什么是存储过程?存储过程(StoredProcedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集。他存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给......
  • 错误: 找不到或无法加载主类 com.itextpdf.samples.sandbox.tables.SimpleTable
    网上有一堆方法,但都没有解决我的问题。解决方法:将下面的勾去掉,保存即可。 这些代码都在test下面,所以这个如果排除的话,是不会执行成功的。  ......
  • Model断开连接建议与Db::close()的bug
    Model断开连接建议与Db::close()的bug-ThinkPHP框架 https://www.thinkphp.cn/bug/1820.html1、建议Model类增加一个close方法,用于断开数据库连接。高并发的时候效果......
  • 重新编译influxdb_exporter源码,构建镜像
    1.githubhttps://github.com/prometheus/influxdb_exporter 2.dockerfileFROMgolang:1.17ENVGO111MODULE=on\GOPROXY="https://goproxy.cn,direct"COPYin......
  • 踩坑,发现一个ShardingJdbc读写分离的BUG
    ShardingJdbc怎么处理写完数据立即读的情况的呢?写在前面我本地使用了两个库来做写库(ds_0_master)和读库(ds_0_salve),两个库并没有配置主从。下面我就使用库里的city表......
  • JDBC应用
    JDBC应用记录JDBC的学习笔记,为后期使用JDBC建立一个简单的速查页面,省去中间的推导等池:DruidDBUtil:ApacheCommonsDbUtils也作为八股文的速查数据库连接的基本步......
  • mongodb基础操作
    前言本文主要针对的是mongoDB的基本操作,以及使用python语言对mongodb的接口调用。使用工具为pycharmerobot3T【已经被收购,推出了收费版。robot3T还是免费的】......