ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

【架构师面试-存储-2】-数据库事务与事务隔离

2021-12-13 10:02:18  阅读:168  来源: 互联网

标签:事务 隔离 read 数据库 脏读 提交 架构师 级别


事务概述

事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败。

事务作用:保证在一个事务中多次SQL操作要么全都成功,要么全都失败。

事务基本特性

(ACID,是针对单个事务的一个完美状态)

原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发,要么都不发生。

一致性(Consistency)

事务前后数据的完整性必须保持一致。保证一致性的工具:锁。

隔离性(Isolation)

事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。隔离性由隔离级别保障!

正常情况下数据库是做不到完完全全的隔离,可以增强隔离级别,但是效率会非常低。

read uncommitted --> read committed --> repeatable read --> serializable 【MySQL默

认隔离级别RR】

事务并发问题:脏读、不可重复读,幻读

丢失更新的问题!

MVCC:multiple version concurrency control(多版本并发控制)为什么需要MVCC?

能不能在隔离性和效果之间找一个平衡点呢?

持久性(Durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

能不能做到100%?

事务并发问题【事务隔离不足导致】

如果不考虑隔离性,事务存在3中并发访问问题。

1. 脏读:一个事务读到了另一个事务未提交的数据

2. 不可重复读:一个事务读到了另一个事务已经提交(update)的数据。引发另一个事务,在事务中的多次查询结果不一致。

3. 虚读 /幻读:一个事务读到了另一个事务已经插入(insert)的数据。导致另一个事务,在事务中多次查询的结果不一致。

事务隔离级别

数据库规范规定了4种隔离级别,分别用于描述两个事务并发的所有情况。

read uncommitted

读未提交,一个事务读到另一个事务没有提交的数据。

存在:3个问题(脏读、不可重复读、幻读)。

解决:0个问题

read committed

读已提交,一个事务读到另一个事务已经提交的数据。

存在:2个问题(不可重复读、幻读)。

解决:1个问题(脏读)

repeatable read

可重复读,在一个事务中读到的数据始终保持一致,无论另一个事务是否提交。

存在:1个问题(幻读)。

解决:2个问题(脏读、不可重复读)

serializable串行化

同时只能执行一个事务,相当于事务中的单线程。

存在:0个问题。

解决:3个问题(脏读、不可重复读、幻读)

安全和性能对比

安全性: serializable > repeatable read > read committed > read uncommitted

性能 : serializable < repeatable read < read committed < read uncommitted

常见数据库的默认隔离级别

MySql: repeatable read

Oracle: read committed

事务案例

设置数据库的隔离级别

set session transactionisolation level 级别字符串

级别字符串: read uncommitted 、 read committed 、 repeatable read 、serializable

例如: set session transaction isolation level read uncommitted;

读未提交:read uncommitted

时间

事务A

事务B

T0

设置A事务隔离级别【读未提交】

设置B事务隔离级别【读未提交】

T1

开始A事务

开始B事务

T2

查询

T3

更新数据

T4

再次查询:查询到B未提交数据【脏读】

T5

回滚

T6

再次查询:B未提交数据消失

T7

A事务提交【必须提交否则会对下次测产生影响】

B事务提交

注意:完成之后必须结束事务,commit,

读已提交:read committed

时间

事务A

事务B

T0

设置A事务隔离级别【读已提交】

设置B事务隔离级别【读已提交】

T1

开始A事务

开始B事务

T2

查询

T3

更新数据

T4

再次查询:数据没变,解决脏读问题

T5

B事务提交

T6

再次查询:数据改变,存在不可重复读问题

T7

A事务提交

可重复读:repeatable read

时间

事务A

事务B

T0

设置A事务隔离级别【可重复读】

设置B事务隔离级别【可重复读】

T1

开始A事务

开始B事务

T2

查询

T3

更新数据

T4

再次查询:数据没变,解决脏读问题

T5

B事务提交

T6

再次查询:数据改变,存在不可重复读问题

T7

A事务提交

串行化:serializable

时间

事务A

事务B

T0

设置A事务隔离级别【串行化】

设置B事务隔离级别【串行化】

T1

开始A事务

开始B事务

T2

查询

T3

更新数据--提示等待,如果A没有进一步操作B将等待超时

T4

A事务提交或者回滚

T5

B等待结束,执行操作

T6

B事务提交

标签:事务,隔离,read,数据库,脏读,提交,架构师,级别
来源: https://blog.csdn.net/chongfa2008/article/details/121850670

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有