事务的隔离性

1、事务隔离级别

     事务有四大特性:原子性、一致性、隔离性、持久性。其中事务的隔离比较重要,事务隔离性处理在数据并发量较大的系统显得比较重要。

     数据库在事务隔离这块提供了四种事务隔离级别,分别是:读取未提交内容(Read Uncommitted),读取已提交内容(Read Committed),可重读(Repeatable Read),串行化(serializable)。

  不同的数据库关于事务隔离的默认级别不同,Oracle数据库默认的隔离级别为Read Committed, MySql的默认隔离之别则为Repeatable Read;

 

2、事务隔离级别对应产生的问题

     为什么不同的数据库采用了不同的默认隔离级别?因为不同的隔离级别在并发操作数据库时会产生不同的问题。 也就是由隔离级出现对应的问题:脏读、不可重复读及幻读

  先了解这几个问题的概念及产生。引用自:MySql事务隔离详解  

     (1) 脏读:在事务并发处理过程中,某一事务读取了另一个事务未提交的数据。如事务A读取到了事务B修改过的数据,但事务B未进行提交。

时间点事务A事务B
1select t.money  from t_account t where t.name='scl' 
2 update t_account t set t.money = t.money+1000 where t.name = 'scl'
3select t.money from t_account t where t.name = 'scl' 
4 commit

    假如 在两事务A、B 都未执行前,scl账号有1000元, 在事务开始后,如果事务A第一次读取到的数据为1000,第二次读到的数据为2000。那么这就出现了脏读。因为在两个不同事务里面应该是相互独立的。不应该读到其他事务的数据。

 

  (2)  不可重复读:在事务并发处理过程中,事务A在某时间点1内读到的数据跟时间点2读到的数据不一致。跟脏读的区别是,事务A先进行查询,然后事务B提交了某一行记录的修改,事务A再次查询数据发现两次读出来的数据不一致。(事务A读取了事务B提交的内容,两次查询某一行或几行数据内容不一致)

时间点事务A事务B
1select t.money  from t_account t where t.name='scl' 
2 update t_account t set t.money = t.money+1000 where t.name = 'scl'
3 commit;
4 select t.money from t_account t where t.name = 'scl' 

         假如 在两事务A、B 都未执行前,scl账号有1000元, 在事务开始后,如果事务A第一次读取到的数据为1000,第二次读到的数据为2000。那么这就出现了不可重复读。因为在      两个不同事务里面应该是相互独立的。A读到了B提交的事务,导致两次读取结果内容不一致。

    (3)  幻读:某事务A进行a表数据查询,然后事务B在a表内插入了一些新数据并且提交,事务A两次查询的数据条数存在差异。 与不可重复读得区别是数据条数增加了。

时间点事务A事务B
1select *  from t_account t   
2 

insert into t_account values ("1000","张三",2000);

insert into t_account values ("1000","李四",3000);

insert into t_account values ("1000","王五",4000);

insert into t_account values ("1000","钱六",6000);

3 commit;
4select *  from t_account t  

           假如 在两事务A、B 都未执行前,使用sql:select * from t_account 返回的是3条数据,在两事务开启后,事务A第一次读取到3条数据,在事务B提交后,事务A读取到了7条数据,那么久出现了幻读现象。

 

3、事务隔离级别应对事务并发产生的问题

  既然事务隔离级别不同会导致事务并发产生问题,那么四个事务隔离级别分别会产生什么问题?在开发时应选择什么哪个隔离级别方式?

隔离级别脏读不可重复读幻读

读取未提交内容(Read Uncommitted)

  √       √ √
读取已提交内容(Read Committed)  X       √ √
可重读(Repeatable Read)  X       X √
串行化(serializable)  X       X X

 

 

 

 

 

       

        可重读这个隔离级别有可能会出现幻读,有可能不出现。取决于数据库当时的实现。

4、事务隔离级别的查询与修改

   Mysql事务隔离有全局事务,会话事务之分。可以通过以下指令查询Mysql里面事务的隔离级别:

         1.SELECT @@global.tx_isolation; 

         2.SELECT @@session.tx_isolation;

         3.SELECT @@tx_isolation;

 
session 指的是当前连接的事务级别,global则是全局的隔离级别。应该使用gobal来设置全局事务隔离级别。并进行相关的测试。

修改事务隔离级别使用指令:set tx_isolation='read-committed';
或者完整的事务隔离更改方法: set global transaction isolation level READ COMMITTED;




需要注意的是:即使使用了全局事务隔离级别设置,但开启的窗口可能有session级别的缓存,把查询窗口关闭再进行一次查询即可确认事务级别是 否正确修改。(在64位Mysql5.5下测试过,无法在已开窗口下正确查询事务隔离级别)


以上为本人对Mysql事务隔离级别的学习总结,如有错误,烦请指出纠正。

      

 

转载于:https://www.cnblogs.com/doucheyard/p/5656610.html

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

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

相关文章

印度首次挑战登月告败,一步之遥≈多大差距?

来源:三体引力波(the-3body)最坏消息还是来了。今天凌晨,印度探测器首次登月尝试,只差一步之遥,距离月表不到2100米,月船2号着陆器与班加罗尔控制中心失去联系,信号中断,…

word交叉引用插入文献后更新域之后编号未更新

这篇文章不教怎么设置交叉引用,这篇文章说的是设好了交叉引用,在某一条文献后面添加了一个文献后,选中全文,右键更新域,编号项仍然没有改变!! 这是因为刚刚在插入文献时是在上一条文献的编号项…

python项目画幅好画_python基础教程总结15——2 画幅好画

标签:要求:从Internet上下载数据文件; 分析数据文件并提取感兴趣的部分工具:图形生成包(ReportLab,PYX等)数据:太阳黑子和射电辐射流量(http://services.swpc.noaa.gov/text/predicted-sunspot-radio-flux…

耐能团队论文登上《自然·电子学》:集成忆阻器与CMOS以实现更好的AI

《自然电子学》杂志封面(资料图,来源:《自然》官网)来源:Kneron耐能近日,《自然》杂志子刊《自然电子学》(Nature Electronics)发表论文《集成忆阻器与CMOS以实现更好的AI》&#xf…

出发

在五点闹铃响的那一刻,小美醒了,叫醒还在熟睡的我,看着窗外已经透亮。快速洗漱,跟小美拥抱,妈妈也起床,“高兴去,平安归”带着每次出门时妈妈的祝福走出家门,坐上昨晚小美预订的滴滴…

word交叉引用多条文献

有时候需要引用多条连续的文献,例如[1][2][3]需要把它变为[1-3],更新域后不受影响仍然正确。 4、选中这两个代码域,右键->切换域代码,再选中这两个代码域,右键->更新域,引用号码变为[13],…

pppcloud云主机内LINUX用户安全管理2

◆超级用户权限与授权 ●建立多个超级用户 不少新系统管理员认为root用户是唯一的超级用户,其实root只是系统默认的超级用户的名称,root并非因为它叫root而成为超级用户的。随便打开一个/etc/passwd文件的例子,你就会发现如下几行&#xff1a…

一份完全解读:是什么使神经网络变成图神经网络?

图1:来自(Bruna等人,ICLR,2014)的图,描绘了3D领域内的MNIST图像。虽然卷积网络很难对球面数据进行分类,但是图网络可以很自然地处理它。可以把它当做是一个处理工具,但在实际应用程序中会出现许多类似的任务…

linux的exec函数

在用fork函数创建子进程后,子进程往往要调用一个exec函数以执行另一个程序 当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程I D并未改变。exec只是…

python中get函数作用_python get函数有什么作用?示例解析

这篇文章之中我们来了解一下关于python字典之中的pythonget函数的相关知识,get函数是什么意思,他有什么作用都将会在接下来的文章之中得到解答。描述Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值。语法get(…

C++vector的reserve和resize比原来的容量小

vector的resize()函数的作用是改变vector元素个数 reverse()函数的作用是改变容量 如果v.reserve(n)函数的n的大小比vector原来的容量小。容量没有变化。size也没有变: 如果v.resize(n)函数的n比vector原来的size小,结果是size…

sql server 游标的使用方法

数据库游标:是面向行来取数据集合的标识,可以很好的弥补面向表或数据集合阅读数据的不便之处;游标的内存消耗也很大,所以使用有标签还要衡量是否值得使用游标标识。 游标举例: declare test_cursor cursor --定义游标…

中国芯片将靠此超车!RISC-V架构神在哪全解构【附下载】

来源: 智东西RISC-V(发音为“risk-five”)是一个基于精简指令集(RISC)原则的开源指令集架构(ISA),简易解释为开源软件运动相对应的一种“开源硬件”。该项目2010年始于加州大学伯克利…

sha256校验工具_使用AIDE工具做入侵检测

AIDE(Advanced Intrusion Detection Environment,高级入侵检测环境)是个入侵检测工具,主要用途是检查文档的完整性。AIDE能够构造一个指定文档的数据库,他使用aide.conf作为其配置文档。AIDE数据库能够保存文档的各种属性,包括:权…

transition过渡的趣玩

本例中将三张图&#xff08;来自网络&#xff09;进行堆叠&#xff0c;鼠标悬停触发。附有源代码 <!DOCTYPE html> <html> <head><title>照片墙</title><meta charset"utf-8"><style type"text/css">.parent{wi…

内存管理之段错误

当程序试图访问不允许访问的内存位置&#xff0c;或试图以不允许的方式访问内存位置时会发生段错误。 几种常见的段错误&#xff1a; 使用野指针 试图修改字符串常量的内容 数组越界 堆栈溢出

网上花店系统源码_如何创建一个花店线上商城,可以开发一个微信小程序

说起来花店&#xff0c;相信很多人都去花店买过花&#xff0c;许多花店通常都是个人开的店&#xff0c;一般位置回去选取在人口稠密的地区&#xff0c;以求争取到附近的流量。一般来说&#xff0c;人们会在有人创业或做些开心的事&#xff0c;或者情人节时买鲜花。随着城市的不…

机器的类比

来源&#xff1a;人机与认知实验室如果说机器深度学习有几个重要的边界&#xff1a;数据边界、语义边界、符号边界和因果边界。那么突破这几个边界的口子可能就是——类比&#xff0c;不仅是比例类比&#xff0c;更是跨域机器类比机理的形成可能就是一条前进的光明大道。实质上…

ligerDialog的使用

1.通过ViewBag来传值。 if (ViewBag.ReturnMessage ! null) 2.脚本代码&#xff1a; 对话框设计与赋值问题。 <script type"text/javascript">$(function () {if (document.getElementById("dialog-BorrowInformation") ! null) {$.ligerDialog.open…

野指针和悬空指针

野指针就是没有被初始化过的指针&#xff1b; 悬空指针是指针最初指向的内存已经被释放了的一种指针