当前位置: 首页 > 编程日记 > 正文

数据事务四种隔离机制和七种传播行为

数据事务四种隔离机制和七种传播行为

一、隔离级别:

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

1. ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。
      这种隔离级别会产生脏读,不可重复读和幻像读。
2. ISOLATION_READ_COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
3. ISOLATION_REPEATABLE_READ:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
      它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
4. ISOLATION_SERIALIZABLE:这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
      除了防止脏读,不可重复读外,还避免了幻像读。


我们使用 test 数据库,新建 tx 表:---MySQL数据库


第1级别:Read Uncommitted(读取未提交内容)


(1)所有事务都可以看到其他未提交事务的执行结果
(2)本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少
(3)该级别引发的问题是——脏读(Dirty Read):读取到了未提交的数据

复制代码
复制代码
#首先,修改隔离级别
set tx_isolation='READ-UNCOMMITTED';
select @@tx_isolation;
+------------------+
| @@tx_isolation   |
+------------------+
| READ-UNCOMMITTED |
+------------------+#事务A:启动一个事务
start transaction;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    3 |    3 |
+------+------+#事务B:也启动一个事务(那么两个事务交叉了)在事务B中执行更新语句,且不提交
start transaction;
update tx set num=10 where id=1;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |   10 |
|    2 |    2 |
|    3 |    3 |
+------+------+#事务A:那么这时候事务A能看到这个更新了的数据吗?
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |   10 |   --->可以看到!说明我们读到了事务B还没有提交的数据
|    2 |    2 |
|    3 |    3 |
+------+------+#事务B:事务B回滚,仍然未提交
rollback;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    3 |    3 |
+------+------+#事务A:在事务A里面看到的也是B没有提交的数据
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |    1 |      --->脏读意味着我在这个事务中(A中),事务B虽然没有提交,但它任何一条数据变化,我都可以看到!
|    2 |    2 |
|    3 |    3 |
+------+------+
复制代码
复制代码

第2级别:Read Committed(读取提交内容)

(1)这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)
(2)它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变
(3)这种隔离级别出现的问题是——不可重复读(Nonrepeatable Read):不可重复读意味着我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果。
     |——>导致这种情况的原因可能有:(1)有一个交叉的事务有新的commit,导致了数据的改变;(2)一个数据库被多个实例操作时,同一事务的其他实例在该实例处理其间可能会有新的commit

复制代码
复制代码
#首先修改隔离级别
set tx_isolation='read-committed';
select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+#事务A:启动一个事务
start transaction;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    3 |    3 |
+------+------+#事务B:也启动一个事务(那么两个事务交叉了)在这事务中更新数据,且未提交
start transaction;
update tx set num=10 where id=1;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |   10 |
|    2 |    2 |
|    3 |    3 |
+------+------+#事务A:这个时候我们在事务A中能看到数据的变化吗?
select * from tx; --------------->
+------+------+                |
| id   | num  |                |
+------+------+                |
|    1 |    1 |--->并不能看到!  |
|    2 |    2 |                |
|    3 |    3 |                |
+------+------+                |——>相同的select语句,结果却不一样|
#事务B:如果提交了事务B呢?            |
commit;                           ||
#事务A:                            |
select * from tx; --------------->
+------+------+
| id   | num  |
+------+------+
|    1 |   10 |--->因为事务B已经提交了,所以在A中我们看到了数据变化
|    2 |    2 |
|    3 |    3 |
+------+------+
复制代码
复制代码

第3级别:Repeatable Read(可重读)


(1)这是MySQL的默认事务隔离级别
(2)它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行
(3)此级别可能出现的问题——幻读(Phantom Read):当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行
(4)InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题

复制代码
复制代码
#首先,更改隔离级别
set tx_isolation='repeatable-read';
select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+#事务A:启动一个事务
start transaction;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    3 |    3 |
+------+------+#事务B:开启一个新事务(那么这两个事务交叉了)在事务B中更新数据,并提交
start transaction;
update tx set num=10 where id=1;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |   10 |
|    2 |    2 |
|    3 |    3 |
+------+------+
commit;#事务A:这时候即使事务B已经提交了,但A能不能看到数据变化?
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |    1 | --->还是看不到的!(这个级别2不一样,也说明级别3解决了不可重复读问题)
|    2 |    2 |
|    3 |    3 |
+------+------+#事务A:只有当事务A也提交了,它才能够看到数据变化
commit;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |   10 |
|    2 |    2 |
|    3 |    3 |
+------+------+
复制代码
复制代码

第4级别:Serializable(可串行化)


(1)这是最高的隔离级别
(2)它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。
(3)在这个级别,可能导致大量的超时现象和锁竞争

复制代码
复制代码
#首先修改隔离界别
set tx_isolation='serializable';
select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+#事务A:开启一个新事务
start transaction;#事务B:在A没有commit之前,这个交叉事务是不能更改数据的
start transaction;
insert tx values('4','4');
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
update tx set num=10 where id=1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
复制代码
复制代码

二、传播行为

1、PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。

2、PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘

3、PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。

4、PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。

5、PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

6、PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

7、PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

转载于:https://www.cnblogs.com/ainiaiwo/p/6027779.html

相关文章:

vue注册新节点_vue怎么重新组装slots节点

在后台列表中通常会有比较多的操作按钮 过多的按钮影响布局 也影响操作 因此想通过vue的组件来控制显示的按钮个数 多余的按钮自动被收进一个特殊的 更多 按钮里面,效果图:组件定义:Vue.component(button-groups, {render(createElement) {re…

什么是EOS?

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 关于EOS有很多炒作。2017年5月,EOS的创始人丹•拉莫(Dan Larimer)在纽约宣布这一消息时,一幅巨大的巨型屏幕广告在时代广场上…

【GDKOI2016Day1T1-魔卡少女】【拆位】线段树维护区间内所有连续子区间的异或和...

题意&#xff1a;给出N个数&#xff0c;M个操作。操作有修改和询问两种&#xff0c;每次修改将一个数改成另一个数&#xff0c;每次询问一个区间的所有连续子区间的异或和。n,m<100000,ai<1000 题解&#xff1a; 当年&#xff08;其实也就是今年&#xff09;做不出来的题…

用composer安装laravel-bjyblog

前面讲了两行命令composer的安装&#xff0c;现在我们来操作一下composer安装基于laravel的博客laravel-bjyblog。测试环境是linux&#xff0c;bt面板&#xff0c;php7.2安装扩展fileinfo/opcache/redis/imagemagick/imap/exif&#xff0c;禁用 proc_open 函数 下面开始安装&am…

微信小程序多项选择器_微信小程序三级联动之多列选择器

有些时候&#xff0c;三级联动业务场景并不只是全国地区选择&#xff0c;可能还涉及到自定义分类的三级联动&#xff0c;这时就需要使用微信的多列选择器。如果只是一列字段&#xff0c;或者每次拖动一次都去服务端取&#xff0c;会比较容易。 如果想一次定义好json,关联数据相…

eosjs-ecc中文文档

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 eosjs-ecc是eos官方处理密钥和签名的javascript开发包。访问地址&#xff1a;eosjs-ecc中文手册。 eosjs-ecc安装 nodejs环境下&#xff0c;使用N…

rocketmq 组监听_最全的RocketMQ学习指南,程序员必备的中间件技能

一、简介RocketMq是阿里开发出来的一个消息中间件&#xff0c;后捐献给Apache。官网上是这样介绍的&#xff1a; Apache RocketMQ™ is a unified messaging engine, lightweight data processing platform.RocketMQ是一个统一的处理消息引擎&#xff0c;轻量级的数据处理平台。…

【刷题】BZOJ 4516 [Sdoi2016]生成魔咒

Description 魔咒串由许多魔咒字符组成&#xff0c;魔咒字符可以用数字表示。例如可以将魔咒字符 1、2 拼凑起来形成一个魔咒串 [1,2]。 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒。 例如 S[1,2,1] 时&#xff0c;它的生成魔咒有 [1]、[2]、[1,2]、[2,1]、[1,2,1] 五种…

jQuery的文档操作方法

jQuery 文档操作方法 这些方法对于 XML 文档和 HTML 文档均是适用的&#xff0c;除了&#xff1a;html()。 方法描述addClass()向匹配的元素添加指定的类名。after()在匹配的元素之后插入内容。append()向匹配元素集合中的每个元素结尾插入由参数指定的内容。appendTo()向目标结…

原 EOS智能合约开发入门

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 EOS智能合约的开发需要使用llvm和abigen来生成abi文件。 为此eos提供了一个 名为eosiocpp的工具。 在这篇文章中&#xff0c;我们介绍如何使用这个工…

python安装虚拟环境virtualenv

虚拟环境 虚拟环境是一个将不同项目所需求的依赖分别放在独立的地方的一个工具&#xff0c;它给这些工程创建虚拟的Python环境。它解决了“项目X依赖于版本1.x&#xff0c;而项目Y需要项目4.x”的两难问题&#xff0c;而且使你的全局site-packages目录保持干净和可管理。 比如&…

可变分区存储管理实验报告总结_操作系统实验报告-可变分区存储管理方式的内存分配回收...

一&#xff0e;实验目的(1)深入了解可变分区存储管理方式的内存分配回收的实现。二&#xff0e;实验内容编写程序完成可变分区存储管理方式的内存分配回收&#xff0c;要求有内存空间分配表&#xff0c;并采用最优适应算法完成内存的分配与回收。三&#xff0e;实验原理在可变分…

ubuntu/linuxmint如何添加和删除PPA源

【添加】 1、sudo add-apt-repository ppa:user/ppa-name 2、sudo apt-get update (然后再安装软件sudo apt-get install <package-name>或更新软件sudo apt-get upgrade) 【删除】 1、cd /etc/apt/source.list.d/ 2、sudo rm <ppa-name> 转载于:https://www.cnblo…

了解EOS看这一篇就够了一、团队二、技术三、项目进度四、争议和风险五、展望

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 无论是混迹于币圈、链圈还是矿圈&#xff0c;对BTC&#xff08;比特币&#xff09;、ETH&#xff08;以太坊&#xff09;、EOS这三大主流币一定不会…

qt 多个模型如何显示在表格中_Qt MOOC系列教程 第五章第四节:QML中的C++模型

我们已经多次讨论过如何创建自己的模型来表示QML中的数据&#xff0c;并且在上一节中我们看到了QStandardItemModel的基本示例。通常&#xff0c;出于性能和功能方面的原因&#xff0c;需要从一开始就要实现自己的模型。QAbstactItemModel类为项目模型类提供了抽象接口&#xf…

ubuntu终端基础命令

1. 启动终端的快捷键: ctr alt t2. 终端字体放大: ctrshift3. 终端字体放大: ctr-4. ls : 查看当前目录的文件信息 4.1 ls 路径&#xff1a; 查看指定目录的信息 4.1. pwd: 查看目录所在的路径5. touch: 创建文件 5.1 touch 1.txt 2.txt 创建多个文件6. mkdir: 创建…

js中操作数组的一些方法

增 push 在数组的末尾添加一个或多个元素&#xff0c;并返回新的长度。 array.push(1,2,3.........) unshift 在数组的开头添加一个或多个元素&#xff0c;并返回新的长度。 array.unshift(1,2,3......) splice 在制定位置添加一个活多个元素&#xff0c;splice(s…

a标签怎么传参_jsp页面中怎么利用a标签的href进行传递参数以及需要注意的地方...

jsp页面中&#xff1a;这是正确写法。需要注意的地方&#xff1a;1、传递的参数是数字2、传递的参数是字符串注意多了个单引号后台直接用request.getParameter("productIdStr"); 接收就可以了。此处也有要注意的地方&#xff1a;接收后要进行判空&#xff0c;否则会报…

转】windows下使用批处理脚本实现多个版本的JDK切换

原博文出自于:  http://www.cnblogs.com/xdp-gacl/p/5209386.html      感谢&#xff01; 一.JDK版本切换批处理脚本 我们平时在window上做开发的时候&#xff0c;可能需要同时开发两个甚至多个项目&#xff0c;有时不同的项目对JDK的版本要求有区别&#xff0c;这时候…

mysql引擎介绍

1.myisam存储引擎&#xff1a;不支持事务&#xff0c;也不支持外键&#xff0c;优势是访问速度快&#xff0c;对事务完整性没有要求或者以select&#xff0c;insert为主的应用基本上可以用这个引擎来创建表。 2.innodb存储引擎&#xff1a;innodb引擎提供了具有提交&#xff0c…

为什么2100万个BTC发行总量少了0.0231?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 许多人只是听说比特币的总数为2100万个&#xff0c;但不知道这个数字的准确来源。实际上&#xff0c;2100万个只是一个近似数&#xff0c;精确的数…

Navicat连接数据库成功,新建查询时提示错误“Cannot create file ……”

Navicat连接数据库成功&#xff0c;新建查询时提示错误“Cannot create file ……” 原因:编辑连接{高级}<设置位置>被修改&#xff0c;该oci.dll不正确 解决方案&#xff1a;删除该连接信息&#xff0c;重新新建。编辑连接{高级}<设置位置>会自动生成&#xff0c;…

[深入React] 2.综述

在开始本教程前&#xff0c;请先查看官方示例&#xff1a;https://github.com/facebook/react/archive/master.zip 里的 examples 目录。 学习react是一个循序渐进的过程&#xff0c;虽然它概念较少&#xff0c;但在思想上和jQuery相差甚远。我在学的时候也是边开发边查官方文档…

element select 自动展开_原生js 让select下拉框自动展开 可用size 属性来代替展开动作...

找遍全网都没一个比较好的例子&#xff01;&#xff01;&#xff01;什么获得焦点事件&#xff0c;或者添加一个点击事件都不能使下拉框自动展开最后用标签的siz属性定义和用法size 属性规定下拉列表中可见选项的数目。如果 size 属性的值大于 1&#xff0c;但是小于列表中选项…

一文看懂怎样用 Python 创建比特币交易

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 比特币价格的上上下下&#xff0c;始终撩动着每一个人无比关切的小心脏。从去年初的 800 美元左右&#xff0c;飞涨到去年底到 19783.21 美元最高点…

[转]mysql 数据类型

原文地址:https://github.com/jaywcjlove/handbook/blob/master/MySQL/MySQL%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B.md MySQL数据类型 数字类型 整数: tinyint、smallint、mediumint、int、bigint浮点数: float、double、real、decimal日期和时间: date、time、datetime、times…

dev treeview控件_在Winform开发框架中使用DevExpress的TreeList和TreeListLookupEdit控件

DevExpress提供的树形列表控件TreeList和树形下拉列表控件TreeListLookupEdit都是非常强大的一个控件&#xff0c;它和我们传统Winform的TreeView控件使用上有所不同&#xff0c;我一般在Winform开发中根据情况混合使用这些控件&#xff0c;不过整体来看&#xff0c;基于DevExp…

util包下的Date与sql包下的Date之间的转换

Java中的时间类型 java.sql包下给出三个与数据库相关的日期时间类型&#xff0c;分别是&#xff1a; Date&#xff1a;表示日期&#xff0c;只有年月日&#xff0c;没有时分秒。会丢失时间&#xff1b; Time&#xff1a;表示时间&#xff0c;只有时分秒&#xff0c;没有年月日。…

【MySQL解惑笔记】忘记MySQL数据库密码

破解MySQL密码 一、MySQL5.7.5之前 只要有系统root密码就可以破解&#xff1a; [roothost-131 ~]# vim /etc/my.cnf //在配置文件中加入如下内容 [mysqld] skip-grant-tables[roothost-131 ~]# systemctl restart mysqld //重启…

接口自动化测试框架

现在市面上做接口测试的工具很多&#xff0c;比如Postman&#xff0c;soapUI, JMeter, Python unittest等等&#xff0c;各种不同的测试工具拥有不同的特色。但市面上的接口测试工具都存在一个问题就是无法完全吻合的去适用没一个项目&#xff0c;比如数据的处理&#xff0c;加…