数据库事务详解

事务特性:acid;aid为了实现c

        原子性:一个事务要么全执行,要么全不执行-》回滚    

                sqlite是备份

                其他是失败执行语义的反向操作-》算法

        一致性:

                完整性约束在一个事务执行后没有被破坏:主键约束,外键约束,自定义约束:转账两个账户余额的和应该不变 -》约束和回滚实现

        持久性:

                无论发生什么:崩溃等   ,都不会出现磁盘上数据的逻辑错误

                其实就是无论发生什么都没有错误(任何错误)

        隔离性:

                事务之间的影响问题

                问题:

                        脏读:读到了其他事务正在修改过程中的临时数据

                                事务A正在访问并修改数据, 事务B读到了A未提交的数据(脏数据)

                        不可重复读:

                                在事务A中先后读取同一个数据, 两次读取的数据不一样,  针对的是update操作

                        幻读:

                                2次读取的过程中,其他事务插入/删除了【有关】数据,针对的是insert和delete操作

                                事务A按照一定条件进行数据读取, 期间事务B插入或删除了相同搜索条件的新数据, 事务A再次按照原来的条件进行读取时, 发现了事务B新插入或删除的数据. 也就是说, 在事务A中按照某个条件先后两次查询数据库, 两次查询结果的条数不同, 这种现象叫做幻读

                         脏写:将临时无用数据写入了

                        第一类丢失更新:事物A 回滚时 让事物B已提交的数据都被回退了

                        第二类丢失更新:事物A读取数据后,事物B修改了数据,但是事物A仍然带着第一次读取的数据进行提交,导致事物B的修改丢失。这个问题有点像读已提交。

                解决方法-》加锁:

                        写锁(排他锁):给数据加上,其他事务   不能写,也不能读,而且数据只能加一个,其实也可以读-》但是不保证【问题】的发生

                                但是注意:写锁对于自己这个事务来说,等于是不加锁的

                        读锁(共享锁):给数据加上,所有事务不能写(只有晋升为写锁才能写),只能读,数据可以加多个事务的。

                                   晋升写锁:数据只加了一个事务的读锁

                                但是注意:读锁对于自己这个事务也是加锁的,整个事务的所有读都一样

                        范围锁:一定操作范围内的数据不能被读取和修改,用于解决幻读问题

                加锁后的结果-》隔离级别:

                        1 可串行化:对事物所有读写的数据,都加上读锁、写锁、和范围锁 就能实现串行化,效率低

                        2 可重复读:对事物涉及的数据加全周期的读锁,写锁;这样全周期读的数据都一样(读锁),也可以保证事务结束写操作实现(写锁):其他事务不能操作。

                                 但是没有解决幻读问题

                        3 读已提交:事物A读取数据部分加读锁,但是未施加全周期的读锁,但是没有解决幻读问题,可重复读问题

                                不可重复读:事务中可能有2次读取数据部分,这样如果其他事务修改,就2次读取数据不一致了-》不可重复读了

                        4 读未提交:对事物涉及的数据只加全周期的写锁,没有解决幻读问题,可重复读问题,脏读问题,但是没有脏写问题

                                脏读:全周期的写锁,相当于自己不加锁,自己可能读到自己的脏数据(临时数据)

                        5 完全不加锁:有所有问题

                                出现脏写问题,就已经连事物的原子性都无法保证了。所以一般隔离级别都不会包括他

                                完全不隔离还会导致第一类丢失更新的问题,就是事物A回滚时,使得事物B已提交的数据被修改。

读未提交解决第一类丢失问题
可重复读解决第二类丢失问题

 MVCC 无锁的隔离场景优化方案:主流的商业数据库都采用了这种方案。

         全称是 Multi-Version Concurrency Control 多版本并发控制

        

MVCC的基本思路

MVCC的"无锁"是特指读取数据时,不需要加锁。
MVCC的基本思路是对数据库的任何修改都不会覆盖之前的数据。而是产生一个新版本副本与老版本共存,以此达到读取时可以完全不加锁的目的。
新版本和老版本,可以理解为每一行记录都有两个看不见的字段,CREATE_VERSION和DELETE_VERSION,这两个字段记录的都是事物的ID。这里事物的ID是一个全局严格递增的数值。
数据被插入时:CREATE_VERSION记录插入数据的事物ID
数据被删除时:DELETE_VERSION记录删除数据的事物ID
数据被修改时:将修改视为“旧数据删除、新数据新增”则原有数据的。DELETE_VERSION和新数据的CREATE_VERSION为本次修改数据的事物ID。
MVCC优化事物隔离的场景

隔离级别是可重复读:总是读取CREATE_VERSION 小于等于当前事物ID的记录,如果有多个就取事物ID最大的一个。这样事物A在读取数据时,事物B更新了数据产生了新的事物ID的CREATE_VERSION记录也不会被读取,事物A仍然读取的是其事物开始时的数据。这个数据不会被更改,天然不需要加锁。
隔离级别是读已提交:每次读取最新的版本即可,这样每次都是读取到最后Commit的数据。
可串行化和读未提交用不上MVCC

串行化的目标是阻塞其他事物的读取和写入,MVCC是做读取时无锁优化的,自然是用不上。
读未提交 是需要直接读取未提交的数据,这种场景下直接修改原始数据即可,无需版本字段。
写入+写入的场景下MVCC无能为力
MVCC针对的是“读+锁”场景的优化,对于“写+写”的场景加锁几乎是唯一可行的解决方案。


2.3.5 乐观加锁和悲观加锁
一般来说提到的锁都是悲观锁(Pessimistic Locking)数据库认为需要先加锁再访问数据,不然肯定会出问题。而乐观锁策略(Optimistic Locking)认为竞争是偶然情况,没有竞争是普遍情况,应该一开始不加锁出现竞争时在补救。这种思路是 (Optimistic Concurrency Control,OCC)“乐观并发控制”
乐观锁和悲观锁的性能优劣主要看并发竞争的剧烈程度,如果竞争剧烈乐观锁反而更慢。

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/201964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【链表Linked List】力扣-24 两两交换链表中的节点

目录 题目描述 解题过程 题目描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:he…

【1day】致远A6系统任意文件下载漏洞学习

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现

安科瑞智慧型动态无功补偿的工业应用—— 以江苏某陶瓷生产企业配电房改造为例

安科瑞电气股份有限公司 摘 要:低压配电系统的无功补偿是电能质量治理的重要环节。在传统无功补偿中,响应速度较慢,补偿电流呈阶梯式,存在过补或欠补的现象,有时未必能到达理想的效果。为了解决这一问题,…

二极管:ESD静电保护二极管

一、什么是ESD二极管 ESD二极管与 TVS二极管原理是一样的,也是为了保护电,但ESD二极管的主要功能是防止静电。 静电防护的前提条件就要求其电容值要足够地低,一般在1PF-3.5PF之间最好,主要应用于板级保护。 二、什么是静电 静…

软件科技成果鉴定测试有什么好处?注意事项有哪些?

软件科技成果鉴定测试是指对软件科技成果进行检测和评估的过程。通过这个测试,可以评估软件科技成果的技术水平、功能性能以及可靠性,并为相关单位和个人提供科学的评价依据。    一、进行软件科技成果鉴定测试有以下好处:   1、客观评价…

什么?你还不会 OpenTiny 跨框架组件库适配微前端?

本文由体验技术团队 TinyVue 组件库成员陈家梅同学分享,带你手把手实现 TinyVue 组件库适配微前端~ 一、前言 以下是我对微前端的一些粗浅理解,对微前端有一定了解的话可以略过,直接进入第二部分。 1、微前端是什么? 我们首先…

AI智能批量写作的工具,免费AI智能写作工具

文本创作成为各行业不可或缺的一环。然而,随着信息量的急剧增长,传统的手工写作方式已经难以满足大规模文本需求。AI智能批量写作作为一项前沿技术,本文将深入探讨AI智能批量写作的方法,介绍一些知名的工具,并对它们进…

东南大学与OpenHarmony携手共建开源生态,技术俱乐部揭牌成立并迎来TSC专家进校园

11月25日,OpenAtom OpenHarmony(以下简称“OpenHarmony”)项目群技术指导委员会(以下简称“TSC”)与东南大学携手,于东南大学九龙湖校区金智楼一楼报告厅举办了“东南大学OpenHarmony技术俱乐部成立仪式暨OpenHarmony TSC专家进校园”活动。此次盛会标志着OpenHarmony开源社区和…

【android开发-17】android中SQLite数据库CRUD详细介绍

1,SQLite数据库读写的操作步骤 在Android中,对SQLite数据库的操作主要包括以下步骤: 1,创建数据库:首先,您需要创建一个SQLite数据库。这可以通过在Android项目中创建一个新的类来实现,该类继…

十年前端之离别的旋律

在一家名叫“梦想家”的小公司里,有一个普通的程序员,他的名字叫做小帅。每天默默地坐在角落里,默默地写着代码,默默地为公司付出。他的眼睛里总是充满了对工作的热爱和对生活的热情,但他的内心却隐藏着一个秘密&#…

Qt之QGraphicsView —— 笔记1.2:将QGraphicsView放置主窗口上,绘制简单图元(附完整源码)

效果 相关类介绍 QGraphicsView类提供了一个小部件,用于显示QGraphicsScene的内容。QGraphicsView在可滚动视口中可视化。QGraphicsView将滚动其视口,以确保该点在视图中居中。 QGraphicsScene类 提供了一个用于管理大量二维图形项的场景。请注意,QGraphicsScene没有自己的视…

微信小程序pc端宽高:默认宽高为1024*812,全屏宽高为1920*1032

最近开发调试pc端小程序,想知道默认打开和全屏这两种情况下的小程序宽高,发现了一种方法: 真机运行pc端小程序,点击devTools 在控制台直接打印window对象,可以获取到pc端默认屏幕宽高为1024*812,全屏pc端小…

打工人副业变现秘籍,某多/某手变现底层引擎-StableDiffusionUI引擎部署

Stable Diffusion Web UI是一个基于Stable Diffusion的交互式程序,使用gradio模块构建而成。除了基本的txt2img、img2img等功能外,该模块还包含许多模型融合改进、图片质量修复等附加升级。所有这些功能都可以通过易于使用的Web应用程序图形用户界面进行访问。 一、简介 St…

基于javaweb存钱小管家网页计划书

基于javaweb存钱小管家网页计划书 系统开发工具:idea 编程语言:Javaweb 数据库:MySQL 用户功能大致如下 需求 1. 功能性需求: (1)通用功能: 用户、管理员:用户包括注册和登录…

vue模拟el-table演示插槽用法

很多人知道插槽分为三种,但是实际到elementui当中为什么这么用,就一脸懵逼,接下来就跟大家聊一聊插槽在elementui中的应用,并且自己写一个类似el-table的组件 vue的slot分为三种::匿名插槽,具名插槽&#x…

Java中去除字符串空格的几种方法

使用这种方法: 5、StringUtils.deleteWhitespace(str); 这是StringUtils类中封装的方法,可以去除所有空格,并且可以匹配空格、制表符、换页符等空白字符的其中任意一个 其他方法: 1、String.trim(): 它去…

线上项目修改最后一招 修改jar中的文件并重新打包成jar

解压jar包 在要操作的jar文件上边cmd打开命令提示符窗口(windows系统), 在cmd命令下执行 jar -xvf xxx.jar 解压jar包(其中xxx.jar换成你的jar包名) jar -xvf admin-1.0.0.jar 替换或者更改操作 如果要替换jar压缩…

说说webpack中代码分割如何实现?

1. 使用动态导入: 动态导入是ES6模块系统的一部分,它允许你在代码中异步加载模块。通过使用import()函数,你可以在需要的时候延迟加载模块,从而实现代码分割。 2. 配置Webpack: 为了实现代码分割,你需要…

前端开发学习 (五) 生命周期函数、Ajax请求

关于vue实例的声明周期,从Vue实例创建、运行、到销毁期间,总是伴随着各种各样的事件,这些事件,统称为生命周期 (https://cn.vuejs.org/v2/guide/instance.html#实例生命周期 ) 而声明周期勾子就是生命周期…

Ubuntu下载离线包、安装离线包(dpkg)

目录 下载离线包 创建存放离线包的文件夹 进入离线包文件夹 下载离线包 安装离线包 注 Centos离线包下载及安装 下载离线包 最好直接切换到root方便 创建存放离线包的文件夹 mkdir apt 进入离线包文件夹 cd apt 下载离线包 sudo apt-get download $(apt-cache depen…