Loading [MathJax]/jax/input/TeX/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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据库中的并发控制
任何时候当有多个查询想要操作相同的数据的时候便会产生并发问题,而这很有可能会导致数据库陷入一种不一致的状态。如果恰好出现问题的数据是一批关键数据,那这个后果往往可能是致命的,因此如何控制并发是数据库中一个很重要的话题。
水货程序员
2018/11/13
1.9K0
记一次mysql事务隔离级别踩坑
同样的条件 ,   第 1 次和第 2 次读出来的记录数(强调的是记录数,而不是记录本身,因为读锁的锁粒度是记录自身,而不是整张表)不一样。
mariolu
2019/08/03
1.6K0
深入浅出数据库事务
说到数据库事务,很多人就会想事务的ACID即原子性,一致性,隔离性,持久性,以及事物的四个隔离级别,但是并不是很明白为什么要用这四个特性来保证事务,以及事务的隔离级别是怎么产生的?包括LZ之前看《高性能MySQL》关于事务的介绍也是一脸蒙蔽,因为太抽象了。偶然在慕课网上看到《在线分布式数据库原理与实践》这个视频,讲的挺不错的。特地总结一波,分享一下,相信读完本文你可以轻松理解这些概念
Java识堂
2019/08/13
4360
《MySQL45讲》读书笔记(六):数据库事务概述[通俗易懂]
有一些客户端连接框架会在连接成功后默认修改设置,这可能导致意外的长事务。因此,显示启动事务明显是比较安全的,但是对于一些需要频繁使用事务的业务,每次都需要调用 begin 然后再 commit。对于这种情况,可以使用 commit work and chain,当 autocommit = 1时,使用该语句可以在提交以后自动开启下一个新事务。
全栈程序员站长
2022/09/23
4560
《MySQL45讲》读书笔记(六):数据库事务概述[通俗易懂]
数据库事务探究
数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。 通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。
翎野君
2023/05/12
3030
一文带你搞懂数据库事务
谈起数据库,事务是绕不开的话题。无论你是研发、实施还是运维,都需要理解、使用无数据事务的特性。数据库事务连接各种数据,是处理各种数据的基础。那么数据库事务究竟是什么意思?数据库事务又有什么特性呢?下面大家就跟随本文一起来搞懂数据库事务吧!
葡萄城控件
2023/03/31
8540
一文带你搞懂数据库事务
数据库事务与隔离级别
事务(transaction)是数据库管理系统的执行单位,可以是一个数据库操作(如Select操作)或者是一组操作序列。事务ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 原子性:保证事务中的所有操作全部执行或全部不执行。例如执行转账事务,要么转账成功,要么失败。成功,则金额从转出帐户转入到目的帐户,并且两个帐户金额将发生相应的变化;失败,则两个账户的金额都不变。不会出现转出帐户扣了钱,而目的帐户没有收到钱的情况
java达人
2018/01/31
6630
数据库事务与隔离级别
面试进阶-数据库中的锁
编程时会用到很多锁,在另一篇文章中有介绍。大部分锁的名字被翻译的很好,例如表锁、行锁、意向锁,见名能知其意。锁的数量很多,锁之间的关系又很复杂,导致学习曲线非常陡峭。锁的数量虽然多但追其根源世界上只有两类锁,乐观锁与悲观锁,他们为更上层的锁提供了理论基础去搭建高层建筑。
sibenx
2020/07/20
5170
面试进阶-数据库中的锁
2、关于数据库事务那些事
事务指的是逻辑上的一组操作,这组操作要么都执行,要么都不执行。最典型的就是转账的例子:
有一只柴犬
2024/04/25
1770
2、关于数据库事务那些事
数据库事务和锁
事务 作为单个逻辑工作单元执行的一系列操作。 事务特性 ACID A atomicity  原子性 事务是不可分割的原子单元,要么全部完成,要么全部不完成,不可能停在中间。操作成功 整个事务提交 commit  操作失败 事务回滚 rollback A给B转账 A扣款  B到账 C consistency 一致性 A给B转账 A转了1000  B只到了500  I isolation 隔离性 多个事务并发访问,事务之间是隔离的 D durabiliy 持久性 事务一旦提交,持久化保存在数据库 断电,重启都不会改变数据
对弈
2019/09/04
5410
数据库事务详解
事务的产生是为了简化我们的编程模型,使我们在开发的过程中不用考虑各种潜在的错误和并发问题,而不是伴随着数据库系统天生就存在的。
我的小熊不见了丶
2019/06/19
6150
Java数据库事务四大特性以及隔离级别
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。失败回滚的操作事务,将不能对数据库有任何影响
用户2184497
2021/09/23
3630
数据库事务详解
什么是『事务』? 事务就是一组具有原子性的操作,这一组操作要么全都正确执行,要么全都不执行。 事务能保证数据库从一种一致性状态转换为另一种一致性状态。 事务的四大特性ACID 1. 原子性 原子性指的是事务是一个不可分割的操作,要么全都正确执行,要么全都不执行。 2. 一致性 事务开始前和事务结束后,数据库的完整性约束没有被破坏。 3. 隔离性 事务的执行是相互独立的,它们不会相互干扰,一个事务不会看到另一个正在运行过程中的事务的数据。 4. 持久性 事务结束后,事务的结果必须是永久保存的。即使数据库
大闲人柴毛毛
2018/03/09
1.3K0
数据库事务详解
数据库事务隔离级别
在并发的场景中,为了保证数据的一致性我们会在数据库中使用事务。然而在强一致性与性能上则需要根据具体业务来取舍,所以一般数据库提供了四种事务隔离级别: 读未提交(Read Uncommitted) 读提交(Read Committed) 可重复读(Repeatable Read) 序列化(Serializable) 由于日常工作中使用事务比较频繁,遂在此作一下总结 在了解这四种事务隔离级别之前,需要了解如下概念: 更新丢失(Lost Update): 两个事务同时修改一行数据,其中一个事务的更新被另外一个事
码农二狗
2018/06/29
5650
【MySQL】数据库事务深入分析
幻读是指事务读取某个范围的数据时,因为其他事务的操作导致前后两次读取的结果不一致。幻读和不可重复读的区别在于,不可重复读是针对确定的某一行数据而言,而幻读是针对不确定的多行数据。因而幻读通常出现在带有查询条件的范围查询中
Java_老男孩
2019/09/06
8910
数据库事务备忘
数据库事务备忘 以前对数据库事务的隔离级别概念不是很清楚,今天看到一篇文章,将这个事情讲得比较清楚,这里记录一下。 数据库事务的特性 原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 一致性(Consistency):事务前后数据的完整性必须保持一致。在事务执行之前数据库是符合数据完整性约束的,无论事务是否执行成功,事务结束后的数据库中的数据也应该是符合完整性约束的。在某一时间点,如果数据库中的所有记录都能保证满足当前数据库中的所有约束,则可以说当
jeremyxu
2018/05/10
7390
深入理解 MySQL ——锁、事务与并发控制
每个连接都会在 MySQL 服务端产生一个线程(内部通过线程池管理线程),比如一个 select 语句进入,MySQL 首先会在查询缓存中查找是否缓存了这个 select 的结果集,如果没有则继续执行解析、优化、执行的过程;否则会之间从缓存中获取结果集。
杨振涛
2019/04/19
7800
深入理解 MySQL ——锁、事务与并发控制
MySQL数据库的事务隔离和MVCC
事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)的缩写,这四种状态的意思是:
数据和云
2019/05/13
1.2K0
MySQL数据库的事务隔离和MVCC
【面试必备】快速理解数据库事务隔离级别
相信用过MySQL的朋友都知道事务,我们也常常通过这个例子来讲解事务的作用:A向B转账,这里可以分为两步操作数据库,A账户余额减少,B账户余额增加。但是,如果在A账户余额减少的时候突然出现了数据库宕机了等情况,是不是会出现A的余额变少了,但是B的余额却没有增加的情况呢?答案是否定的。原因就是数据库支持事务(常用的关系型数据,如MySQL、Oracle等)。
Happyjava
2019/08/20
6870
【面试必备】快速理解数据库事务隔离级别
事务处理(二) - 数据库事务
事务的作用是将一系列操作作为一个整体,一但其中出现问题,会回滚到事务的开始状态。即事务维护了数据的完整性和一致性。
逝兮诚
2019/10/30
6600
相关推荐
数据库中的并发控制
更多 >
LV.4
vivo后台开发工程师
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验