Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据库事务管理与并发控制机制

数据库事务管理与并发控制机制

原创
作者头像
mariolu
发布于 2024-07-12 01:15:23
发布于 2024-07-12 01:15:23
23900
代码可运行
举报
运行总次数:0
代码可运行

一、什么是事务

事务上一系列SQL语句组成,用来保证要么一组全部完成,或者都不完成。事务执行中也支持回滚,保证操作中的任何数据修改都不会提交。事务里的操作其实是会立即在数据发生修改的,只是修改的数据不会被其他客户端的查询看见,因为用到了锁机制。

事务通常以BEGIN TRANSCATION开始,事务通常可以包含修改性的语句:insert、update、delete、merge(也就是select for update)。然后最终要么COMMIT或者ROLLBACK。除了显示表达commit或者roolback,还有隐形发生的roolback或者commit。比如

  • 隐性的roolback:网络断开连接。
  • 隐形的commit:关闭会话
  • 隐形的commit:开始一个DDL命令create

通常来说insert/update/delete/merge都包含子查询select语句。查询语句在事务内部看到是当前事务insert/update/delete/merge的最新数据,而在事务外面看不到这些数据更新,除非当前事务被commit之后。

1.1 事务解决问题

事务最经常解决的是不同客户端的数据竞争问题。还可以用来,

  • 要执行某个操作非常小心,然后你写个事务,等待提交前检查一遍确认ok后才正式commit
  • 打包所有语句成一次性atomic级别的数据更新。不会有人看到中间状态的脏数据
  • 组合语句,变成要么提交,要么不提交,比如说

SELECT columns FROM LiveTable

<Do calculations - 可以是SQL或者呼叫其他应用>

BEGIN TRAN

INSERT data INTO DataWarehous

UPDATE LiveTable SET ETLDone = 1 WHERE it was inserted into DW

COMMIT

二、并发控制机制

不同的事务隔离机制提供了不同一致性等级。我们以云上存储系统为例。云存储在多个机器提供了冗余数据以面对不可预知的故障。数据在多台机器之间并不总是保持完全一致。因此数据从不同服务器读到的可能是不同版本的数据。

云产商比如微软Azure提供的是强一致性服务。强一致性服务确保所有客户端总是看到最后一次提交的数据。强一致性还比如经常用于数据中心之间的同步。这些数据中心常常分不在不同地理位置不同大洲的机房。

也有很多云存储系统比如Amazon S3设计为弱一致性的服务。这样设计的理由是强一致性是成本代价很大。通过对一致性的妥协来换取可用性和更好的性能。这种系统里,客户端可能读到的是过时的数据,不一定是最新版本的数据。读取过期数据会发现在还来不及同步其他数据中心的数据之前。这种系统也称为最终一致性。

当然还有些厂商提供了不同的级别来给用户选择,比如Amazon DynamoDB同时提供了强一致性和最终一致性。

还有些厂商提供了一种介于强一致性和最终一致性的方案。比如说读取到不过期5分钟的数据提交。

折衷一致性的背后原理就是CAP准则。CAP理论就是系统必须容忍网络分区的存在,用户必须在Consistency和Availablablity的之间选择。

我们来看一下一般数据库怎么做到事务隔离。

一、事务的隔离级别

1.1 隔离级别对应的读到的状态可能性

事务隔离级别有四种,以下图为例,四种隔离级别的读数据状态会是不一样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
事务 A:  |---0---|---1---|---2---|---3---|---4---|
事务 B:                          |---5---|---6---|---7---|---8---|
查询操作:|读事务开始 <--- 不同的隔离级别在不同的时间点读到不同的状态-->|
  • READ UNCOMMITABLE: 这种读到状态可能是最多的0-8都有可能
  • READ COMMITTABLE : 这种读到0、4、8
  • REPEATEDABLE READ:这种读到0
  • SERAIABLE:查询操作不可访问,并且事务B的操作会被阻塞。效果如下图
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
事务 A: |---0---|---1---|---2---|---3---|---4---|
事务 B:                                         |---5---|---6---|---7---|---8---|
查询操作: 无论是读事务或者写事务 都会得到排他锁,如果是对同一记录操作,事务A一旦先开始,事务B就不能操作,或者查询也不能操作。

1.2 从锁机制看事务隔离级别

  • READ UNCOMMITABLE: 无任何事务控制,无加任何读锁,写锁
  • READ COMMITABLE,写时候加了排他锁,读了时候使用记录粒度的读锁(共享锁,这个共享锁 不锁事务,锁记录)。事务A查询的时候 读到的是就记录,事务B做了提交,事务A再次查询(也就是不可重复读)。这两次会得到不一样的结果。如果在一个事务里,这个事务里做了两次同样的记录数量查询。两次查询的结果不一样(幻读)。
  • REPEATEDLE READ,可重复读,和READ COMMITABLE不同的时,读锁(共享锁)锁的是整个事务执行的过程。所以在整个事务的执行过程中,任何其他事务尝试更新完这条记录的结果,这个读事务都是用MVCC提交前的版本)。和READ COMMITABLE区别的是,读记录锁的是记录还是事务过程。两者锁的时间不一样。
  • SERAIABLE:RANGE KEY,查询满足这个range范围的这些个数的记录都被锁住。
1.2.1 不可重复读和幻读的区别

不可重复读的重点是修改:

同样的条件 ,   你读取过的数据 ,   再次读取出来发现值不一样了

幻读的重点在于新增或者删除(导致记录数变化)

同样的条件 ,   第 1 次和第 2 次读出来的记录数(强调的是记录数,而不是记录本身,因为读锁的锁粒度是记录自身,而不是整张表)不一样。

1.3 不同隔离级别的错误读取

通过在写的时候加锁,可以解决脏读。

通过在读的时候加锁(或者MVCC提供旧的提交版本),可以解决不可重复读。

通过串行化,可以解决幻读。

隔离级别

脏读

不可重复读

幻读

READ UNCOMMITABLE

1

1

1

READ COMMITABLE

0

1

1

REPEATABLE READ

0

0

1

SERIAL

0

0

0

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
记一次mysql事务隔离级别踩坑
同样的条件 ,   第 1 次和第 2 次读出来的记录数(强调的是记录数,而不是记录本身,因为读锁的锁粒度是记录自身,而不是整张表)不一样。
mariolu
2019/08/03
1.6K0
数据库事务探究
数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。 通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。
翎野君
2023/05/12
3020
《MySQL45讲》读书笔记(六):数据库事务概述[通俗易懂]
有一些客户端连接框架会在连接成功后默认修改设置,这可能导致意外的长事务。因此,显示启动事务明显是比较安全的,但是对于一些需要频繁使用事务的业务,每次都需要调用 begin 然后再 commit。对于这种情况,可以使用 commit work and chain,当 autocommit = 1时,使用该语句可以在提交以后自动开启下一个新事务。
全栈程序员站长
2022/09/23
4560
《MySQL45讲》读书笔记(六):数据库事务概述[通俗易懂]
详解MySQL并发控制及事务原理
在如今互联网业务中使用范围最广的数据库无疑还是关系型数据库MySQL,之所以用"还是"这个词,是因为最近几年国内数据库领域也取得了一些长足进步,例如以TIDB、OceanBase等为代表的分布式数据库,但它们暂时还没有形成绝对的覆盖面,所以现阶段还得继续学习MySQL数据库以应对工作中遇到的一些问题,以及面试过程中关于数据库部分的考察。
用户5927304
2020/11/03
7400
详解MySQL并发控制及事务原理
2、关于数据库事务那些事
事务指的是逻辑上的一组操作,这组操作要么都执行,要么都不执行。最典型的就是转账的例子:
有一只柴犬
2024/04/25
1770
2、关于数据库事务那些事
【MySQL】:数据库事务管理
事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
屿小夏
2024/04/22
4340
【MySQL】:数据库事务管理
数据库事务详解
数据库事务详解 什么是事务 事务特性(ACID特性) 原子性、一致性、隔离性、持久性 事务的隔离级别 Read uncommitted:读未提交 Read committed:读提交 Repeatable read:可重复读 Serializable:序列化 什么时候会出现幻读? 如何查看当前事务的隔离级别 如何设置事务的隔离级别 提交事务 回滚事务 脏读 怎么解决脏读? 虚读(幻读) 怎么解决幻读? 不可重复读 怎么解决不可重复读? 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否
是阿超
2021/12/30
6250
PostgreSQL 的事务管理和并发控制机制解析
在本篇博客中,我们将深入解析 PostgreSQL 的事务管理和并发控制机制。事务管理和并发控制是 PostgreSQL 强大功能的基石,它们保证了数据库的数据一致性和并发处理的高效性。
猫头虎
2024/04/08
4670
PostgreSQL 的事务管理和并发控制机制解析
数据库事务和锁
事务 作为单个逻辑工作单元执行的一系列操作。 事务特性 ACID A atomicity  原子性 事务是不可分割的原子单元,要么全部完成,要么全部不完成,不可能停在中间。操作成功 整个事务提交 commit  操作失败 事务回滚 rollback A给B转账 A扣款  B到账 C consistency 一致性 A给B转账 A转了1000  B只到了500  I isolation 隔离性 多个事务并发访问,事务之间是隔离的 D durabiliy 持久性 事务一旦提交,持久化保存在数据库 断电,重启都不会改变数据
对弈
2019/09/04
5400
数据库事务与事务隔离级别
数据库事务可以这么理解,满足数据库ACID特性的一组操作。我们可以使用COMMIT命令提交事务,也可以用ROLLBACK回滚事务。
玖柒的小窝
2021/12/07
4430
数据库事务与事务隔离级别
深入浅出数据库事务
说到数据库事务,很多人就会想事务的ACID即原子性,一致性,隔离性,持久性,以及事物的四个隔离级别,但是并不是很明白为什么要用这四个特性来保证事务,以及事务的隔离级别是怎么产生的?包括LZ之前看《高性能MySQL》关于事务的介绍也是一脸蒙蔽,因为太抽象了。偶然在慕课网上看到《在线分布式数据库原理与实践》这个视频,讲的挺不错的。特地总结一波,分享一下,相信读完本文你可以轻松理解这些概念
Java识堂
2019/08/13
4360
深入理解 MySQL ——锁、事务与并发控制
每个连接都会在 MySQL 服务端产生一个线程(内部通过线程池管理线程),比如一个 select 语句进入,MySQL 首先会在查询缓存中查找是否缓存了这个 select 的结果集,如果没有则继续执行解析、优化、执行的过程;否则会之间从缓存中获取结果集。
杨振涛
2019/04/19
7800
深入理解 MySQL ——锁、事务与并发控制
【数据库设计和SQL基础语法】--事务和并发控制--事务的隔离级别
隔离级别是指在数据库系统中,一个事务的执行是否会受到其他事务影响的程度,以及事务之间相互隔离的程度。隔离级别主要用于控制事务之间的相互影响,确保数据库系统在并发执行多个事务时能够保持数据的一致性和可靠性。 在SQL事务中,有四种标准的隔离级别,每一种级别都提供了一种不同的事务隔离水平,这些级别是:
喵叔
2023/12/28
3340
一文带你搞懂数据库事务
谈起数据库,事务是绕不开的话题。无论你是研发、实施还是运维,都需要理解、使用无数据事务的特性。数据库事务连接各种数据,是处理各种数据的基础。那么数据库事务究竟是什么意思?数据库事务又有什么特性呢?下面大家就跟随本文一起来搞懂数据库事务吧!
葡萄城控件
2023/03/31
8540
一文带你搞懂数据库事务
数据库事务与隔离级别
事务(transaction)是数据库管理系统的执行单位,可以是一个数据库操作(如Select操作)或者是一组操作序列。事务ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 原子性:保证事务中的所有操作全部执行或全部不执行。例如执行转账事务,要么转账成功,要么失败。成功,则金额从转出帐户转入到目的帐户,并且两个帐户金额将发生相应的变化;失败,则两个账户的金额都不变。不会出现转出帐户扣了钱,而目的帐户没有收到钱的情况
java达人
2018/01/31
6610
数据库事务与隔离级别
事务处理(二) - 数据库事务
事务的作用是将一系列操作作为一个整体,一但其中出现问题,会回滚到事务的开始状态。即事务维护了数据的完整性和一致性。
逝兮诚
2019/10/30
6590
数据库中的并发控制
任何时候当有多个查询想要操作相同的数据的时候便会产生并发问题,而这很有可能会导致数据库陷入一种不一致的状态。如果恰好出现问题的数据是一批关键数据,那这个后果往往可能是致命的,因此如何控制并发是数据库中一个很重要的话题。
水货程序员
2018/11/13
1.9K0
【MySQL】数据库事务深入分析
幻读是指事务读取某个范围的数据时,因为其他事务的操作导致前后两次读取的结果不一致。幻读和不可重复读的区别在于,不可重复读是针对确定的某一行数据而言,而幻读是针对不确定的多行数据。因而幻读通常出现在带有查询条件的范围查询中
Java_老男孩
2019/09/06
8900
数据库事务备忘
数据库事务备忘 以前对数据库事务的隔离级别概念不是很清楚,今天看到一篇文章,将这个事情讲得比较清楚,这里记录一下。 数据库事务的特性 原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 一致性(Consistency):事务前后数据的完整性必须保持一致。在事务执行之前数据库是符合数据完整性约束的,无论事务是否执行成功,事务结束后的数据库中的数据也应该是符合完整性约束的。在某一时间点,如果数据库中的所有记录都能保证满足当前数据库中的所有约束,则可以说当
jeremyxu
2018/05/10
7390
数据库事务详解
事务的产生是为了简化我们的编程模型,使我们在开发的过程中不用考虑各种潜在的错误和并发问题,而不是伴随着数据库系统天生就存在的。
我的小熊不见了丶
2019/06/19
6150
相关推荐
记一次mysql事务隔离级别踩坑
更多 >
LV.4
vivo后台开发工程师
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验