事务(Transaction)逻辑应用
1.什么是事务?
是一个逻辑工作单元,这个工作单元中的所有操作,要么都成功,要么都失败
2.事务是如何保证数据的正确性的?
通过事务的四大特性:原子性、一致性、隔离性、持久性
原子性(Atomicity):通过undolog回滚日志实现其原子性
一致性(Consistent):引擎层面使用的是undolog回滚日志以及让mysql具备故障恢复能力的redolog重做日志,服务层面使用的是binlog归档日志
隔离性(Isolation):首先是事务并发带来的问题:脏读、不可重复读、幻读
事务的隔离级别:读未提交(read-uncommitted)、读已提交(RC)、可重复读(RR)、可串行化(serializable)
查看数据库的隔离级别:select @@tx_isolation (mysql数据库的默认级别是repeatable-read)设置就是set tx_isolation=‘serializable’
事务隔离底层实现:锁的设计、MVCC
持久性(Darble):通过redolog重做日志实现
原子性(通过undolog实现-执行回滚)
隔离性(通过锁,MVCC-多版本并发控制)
一致性(通过undolog,redolog,binlog)
持久性(通过redolog日志实现)
3.多个事务并发执行时,可能会带来什么问题?
1)脏读:一个事务读取了其他事务未提交的数据,然后这个数据后面又回滚了
2)不可重复读:一个事务对同样的查询条件进行多次查询时,得到的结果不一致
3)幻读:一个读取到的数据可能是表中不存在的数据
注意:事务的隔离级别越高,并发性可能会越差
4.mysql中的锁是如何分类的?
从性能上可以分为乐观锁和悲观锁
从操作类型上可以分为读锁(共享锁)和写锁(排他锁)
从数据操作粒度上来讲可以分为全局锁、表锁、行锁、间隙锁(between 100 and 200)
5.如何理解MySQL中的全局锁?
全局锁是要关闭所有打开的表。在mysql可以使用全局锁锁定所有表,通常应用于逻辑备份,我们在执行数据库备份时,不允许其他事务对数据库进行更新了,因为这样可能会导致备份的数据与库中实际的数据不一致。
6.MySQL中的全局锁是如何应用的?
加全局读锁(flush table with read lock):只能读库中所有表的数据,但是不能写(insert、delete、update)
解锁(unlock tables)
7.如何对MySQL中的表添加读锁(共享锁)、写锁(排它锁)?
读锁(lock table regions read):所有线程可以读,当前线程写会出错,其它线程写会阻塞。
写锁(lock table regions write):当前线程可以读写,其它线程读写要阻塞。
解锁(unlock tables)
8.如何对MySQL表中的行添加行锁(InnoDB默认select操作不加锁)?
共享锁 (select * from regions where id=13 lock in share mode),又称为S锁,允许当前事务读取一行,阻止其它事务获取相同数据集的排它锁。
排它锁 (select * from regions where id=13 for update),又称为X锁。允许当前事务更新数据,阻止其它事务获取相同数据集的共享锁和排它锁。
9.MVCC是什么?
MVCC(Multi Version Concurrent Control)多版本并发控制,可通过这种方式在保证其性能的基础上实现事务的隔离级别。例如MySQL中的RC、RR事务的隔离级别底层就是通过MVCC实现的。
10.MVCC的底层逻辑是如何实现的呢?
MVCC的实现原理主要依赖于记录中的undolog(回滚日志)、ReadView(快照读)、三个隐藏字段 来实现的
三个隐藏字段:
DB_TRX_ID:记录创建这条记录或者最后一次修改该记录的事务id
DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本,用于配合undolog实现数据的回滚.
DB_ROW_ID:隐藏的主键,如果数据表没有主键,也没有非空且唯一的字段,那么innodb会自动生成一个row_id。
11.如何理解MVCC中的版本链?
当我们开启了一个事务,并且这个是要对数据进行更新,此时会产生一条undolog日志,多个事务同时操作这一条记录时,那就会产生多个版本的undolog日志,这些日志就会通过回滚指针(DB_ROLL_PTR)构建一个链表,这个链表就称之为版本链。
12.什么是ReadView?以及应用场景?
ReadView提供了某一时刻事务系统的一个快照读,主要是用来做“可见性”判断。这个ReadView中也保存了对本事务不可见的一些其他活跃事务的id。
对于Read Committed和Repeatable Read的隔离级别,都要读取已经提交的事务数据,也就是说如果版本链中的事务没有提交,该版本的记录是不能被读取的,那哪个版本的事务是可以读取的,此时就引入了ReadView。MySQL数据库的隔离级别中的Read Committed和Repeatable Read底层都是通过这个MVCC实现的。
13.ReadView中包含什么?
MySQL5.7版本中的ReadView包含以下几个属性:
1)m_ids:截止到当前事务id之前,所有活跃的事务id(还没有commit的事务)。例如m_ids【1,2,3,4】
2)mix_trx_id:记录活跃事务id中(m_ids)的最小值。例如1
3)max_trx_id:保存当前事务结束后应分配的下一个事务的id值。例如5
4)creator_trx_id:保存创建ReadView的当前事务的id。例如4
ReadView会根据图中的四个属性,再结合undo日志版本链,实现MVCC机制,决定一个事务可以读取到的数据版本。
14.ReadView的可见性判断规则是怎样的?
一个事务去访问记录的时候,除了自己的更新记录总是可见之外,还有这几种情况:
1. 如果记录的 trx_id 值小于 Read View 中的 min_trx_id 值,表示这个版本的记录是在创建 Read View 前已经提交的事务生成的,所以该版本的记录对当前事务可见。
2. 如果记录的 trx_id 值大于等于 Read View 中的 max_trx_id 值,表示这个版本的记录是在创建 Read View 后才启动的事务生成的,所以该版本的记录对当前事务不可见。
3. 如果记录的 trx_id 值在 Read View 的 min_trx_id 和 max_trx_id 之间,需要判断 trx_id 是否在 m_ids 列表中:
如果记录的 trx_id 在m_ids 列表中,表示生成该版本记录的活跃事务依然活跃着(还没提交事务),所以该版本的记录对当前事务不可见。
如果记录的 trx_id 不在 m_ids 列表中,表示生成该版本记录的活跃事务已经被提交,所以该版本的记录对当前事务可见。
15.事务的隔离级别(Read Committed 和Repeatable Read)何时创建的ReadView视图?
1)Read Committed隔离级别是每次select都会创建一个新的ReadView(可以读取已经提交的数据)
2)Repeatable Read隔离级别是第一次select时创建一个ReadView(每次只能读取当前事务的数据)
16.可重复读底层逻辑是如何实现的?
详情:(https://www.processon.com/view/link/63a1a5cb517570317d7bb536)
事务(Transaction)逻辑应用的更多相关文章
- SQL Server 数据库的维护(三)__事务(transaction)和锁
--维护数据库-- --事务(transaction)和锁-- --事务(transaction)-- --概述: 事务是指封装了一组T-SQL语句的单个逻辑单元.单元中的所有语句作为一个整体,在满足 ...
- redis源码分析之事务Transaction(下)
接着上一篇,这篇文章分析一下redis事务操作中multi,exec,discard三个核心命令. 原文地址:http://www.jianshu.com/p/e22615586595 看本篇文章前需 ...
- 事务Transaction
目录 为什么写这系列的文章 事务概念 ACID 并发事务导致的问题 脏读(Dirty Read) 非重复读(Nonrepeatable Read) 幻读(Phantom Reads) 丢失修改(Los ...
- JDBC中的事务-Transaction
事务-Transaction 某些情况下我们希望对数据库的某一操作要么整体成功,要么整体失败,经典的例子就是支付宝提现.例如我们发起了支付宝到银行卡的100元提现申请,我们希望的结果是支付宝余额减少1 ...
- Spring事务Transaction配置的五种注入方式详解
Spring事务Transaction配置的五种注入方式详解 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学 ...
- SQL Server中事务transaction如果没写在try catch中,就算中间语句报错还是会提交
假如我们数据库中有两张表Person和Book Person表: CREATE TABLE [dbo].[Person]( ,) NOT NULL, ) NULL, ) NULL, [CreateTi ...
- FireDAC 下的 Sqlite [7] - 备份、优化、事务(Transaction)
用 TFDSQLiteBackup 控件, 两三行代码即可完成 Sqlite 数据库的备份. procedure TForm1.Button1Click(Sender: TObject); begin ...
- 事务(Transaction)概念和特性
http://baike.baidu.com/view/121511.htm 概念 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库 ...
- 数据库事务(Transaction)
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 事务四大特性(ACID): 原子性(Atomicity):个事务是一个不可分割的工作单位,事务中包括的 ...
- Spring框架系列(六)--事务Transaction
本文绝大部分内容为转载,原文地址:https://blog.csdn.net/trigl/article/details/50968079 除此之外,后面还有延伸内容 事务在企业日常开发中几乎是一定会 ...
随机推荐
- 与TNF拮抗剂治疗AS临床和MRI疗效相关的血清生物标记物
与TNF拮抗剂治疗AS临床和MRI疗效相关的血清生物标记物 PresentID: THU0223 SERUM BIOMARKERS ASSOCIATED WITH CHANGES IN ASDAS A ...
- 关于 Knex update 语句报错:Undefined binding(s) detected when compiling UPDATE
下图是详细的报错截图,我敢保证前端传递的数据一个不漏,但还是报我没有绑定对应的字段: 官方文档的使用案例基本上都是where 子句在 update 语句之前.但,select 语句的 where 子句 ...
- GeoServer在Linux上源码安装、启动、发布地图服务
1. 环境准备 笔者此次使用的Linux系统是CentOS 8 ,没错,目前已经停止维护,但就操作而言,和其他Linux发行版大同小异 目前的GeoServer版本是2.21 1.1 Git环境 yu ...
- Java学习笔记(三)java方法
学习笔记3 Java方法 一.什么是方法 System.out.println() 是什么 System是一个类,out是一个对象,println()就是一个方法 意思是调用System中的out对象 ...
- 发送邮件找回密码采用outlook的 pop和smtp方式、qq邮箱smtp
一.outlook的pop方式,并指定发送人邮箱地址: 需要引入dll:Microsoft.Office.Interop.Outlook Outlook.Application olApp = new ...
- Parsing error: missing-whitespace-between-attributes
给如下位置添加空格即可 在文件末尾添加一空白行即可
- 2021年爆出log4j漏洞修复
(1)用户可自查系统是否引用 Apache log4j-core 依赖,没有引用则不受漏洞影响. (2)排查系统中日志配置是否采用远程动态加载模式.(3)排查系统中是否正在使用JDBCAppender ...
- mysql修改密码遇到的问题
在docker上安装了 mysql 容器,mysql镜像是8.0+版本 修改密码语句: 只针对本机生效 alter user "root"@'localhost' identifi ...
- 2.13python基础知识
编程语言的发展史 1.机器语言:内部用0和1表示 2.汇编语言:简单的字母表示二进制 3.高级语言:人类可以理解的 1.执行效率:机器语言>汇编语言>高级语言(编译型>解释型) 2. ...
- Oracle 验证身份证号
--验证身份证号是否正确CREATE OR REPLACE FUNCTION fn_checkidcard (p_idcard IN VARCHAR2) RETURN INT IS v_regstr ...