首页 > 其他分享 >一文搞懂事务四大特性、隔离级别、传播机制

一文搞懂事务四大特性、隔离级别、传播机制

时间:2023-05-09 09:35:39浏览次数:64  
标签:事务 一文 数据库 提交 搞懂 执行 数据 隔离

事务四大特性、隔离级别、传播机制

事务四大特性(ACID)

如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性:

原子性(Atomic)

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

一致性(consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,一个事务不会被另一个事务影响,最理想的就是等待一个事务执行完成后再执行另一个事务,但处于性能上的考虑,一般都需要事务并发执行,就要求事务执行过程中不受到并行执行的事务的影响,例如不能读取到另一个未提交(提交就是指事务执行完成)事务写入的值。

即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

例如:我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

事务并发产生问题(脏读,幻读,不可重复读)

脏读

脏读,指的是读到了其他事务未提交的数据。

image

事务A读取到了事务B未提交的数据,假设事务B回滚,则事务A读取到数据实际是不存在的。

幻读

image

假设这里的隔离级别是可重复读(RR),因为RU、RC会存在脏读,不可重复读的问题,为了先排除其他干扰,故以RR情况研究。

业务逻辑:查询是否存在id为1的数据,没有则插入。

1、事务B第一次查询id=1,发现id为1的数据不存在。

2、此时事务A插入id为1的数据并提交事务。

3、事务B,再去查询 id为1 的数据,发现还是没有记录(RR隔离级别所以读到依然没有数据)

4、于是事务B插入一条 id=1 的数据。

5、事务B提交事务,发现报错。查的时候明明没有这条记录,但插入的时候 却告诉我 主键冲突,这就好像幻觉一样。

不可重复读

不可重复读,指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况。

image

事务B在一次事务中相同查询条件多次查询数据结果不一致。

事务隔离级别

读未提交(Read uncommitted)

在读取数据时不会加任何锁,也不会进行检测,就是一个事务可以读取另一个未提交事务的数据。

读已提交(Read committed)

只读取提交的数据等待其他事物释放排他锁,读数据的共享锁在读操作完成后会立即释放。这个隔离级别是sqlserver默认的隔离级别。

可重复读(Repeatable read)

重复读,就是在开始读取数据(事务开启)时,不再允许修改操作(解决了不可重复读的问题),但是解决不了新增数据的问题(幻读)。

像已提交读一样,但共享锁会保持到事物结束才会释放。

序列化(Serializable)

类似于可重复读,但锁不仅会锁定所查询的数据,也会锁定所查询的范围,这样就阻止了新数据插入所查询的范围。

隔离级别 脏读 幻读 不可重复读 丢失更新 并发模型 更新冲突检测
读未提交 Read uncommitted 悲观
读已提交 Read committed 悲观
可重复读 Repeatable read 悲观
串行化 Serializable 悲观
sqlserver,oracle 默认事务隔离级别是读已提交,mysql 默认事务隔离级别是 可重复读

事务传播机制

required

如果当前存在事务,就加入该事务。如果当前没有事务,就创建一个新事务。(默认设置)。

只创建一个事务。

requires_new

不管是否存在事务,都创建一个新的、自己的事务。老事务 先挂起,再创建 新事务, 新事务 执行完并提交,接着,继续执行 老事务,最后提交。

先执行的方法后提交事务,后执行的方法先提交事务。老事务 的回滚,不会影响 新事务 的提交。

nested

如果当前存在事务,则 嵌套事务与外面事务使用同一事务,不同的是 嵌套内部开启一个新的保存点( savepoint ),执行有两种情况:

(1)当嵌套内部 发生回滚,不影响外面事务的正常提交。

(2)当外面事务 发生回滚,则嵌套内的事务要回滚。

如果当前没有事务,则执行与 required 类似的操作。

supports

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

supports 不会创建事务。

not_supported

不支持事务。如果当前存在事务,就把当前事务 挂起。如果当前没有事务,就以非事务执行。

mandatory

强制、必须使用事务。如果当前已经存在事务,就加入该事务,如果当前不存在事务,就 抛出异常

mandatory 不会创建事务。mandatory 执行的前提是已经存在事务。

never

禁止事务 。如果当前存在事务,则 抛出异常,如果当前没有事务,以非事务方式执行。

必须在一个没有事务中执行,否则报错。

标签:事务,一文,数据库,提交,搞懂,执行,数据,隔离
From: https://www.cnblogs.com/physicx/p/17383827.html

相关文章

  • 事务隔离机制
    一事务隔离机制/级别介绍事务具有原子性、一致性、隔离性、持久性四大特性,而隔离性顾名思义指的就是事务彼此之间隔离开,多个事务在同时处理一个数据时彼此之间互相不影响,如如果隔离的不够好就有可能会产生脏读、不可重复度、幻读等读现象,为此,隔离性总共分为四种级别由低到高依......
  • 数据库的四大特性和事务隔离级别
    数据库中经常被问到四大特性和隔离级别,一般都是涉及到概念性问题,在此做一些整理总结,方便理解。1、事务的隔离级别由低到高依次为Readuncommitted(未授权读取、读未提交)、Readcommitted(授权读取、读提交)、Repeatableread(可重复读取)、Serializable(序列化),这四个级别可以逐个解决脏......
  • 一文深入了解CSRF漏洞
    1.1.定义跨站请求伪造(英语:Cross-siterequestforgery),也被称为one-clickattack或者sessionriding,通常缩写为CSRF或者XSRF,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨站脚本(XSS)相比,XSS利用的是用户对指定网站的信任,CSRF利用的是网站......
  • 非隔离双向DC/DC变换器 buck-boost变换器仿真
    非隔离双向DC/DC变换器buck-boost变换器仿真输入侧为直流电压源,输出侧接蓄电池模型采用电压外环电流内环的双闭环控制方式正向运行时电压源给电池恒流恒压充电,反向运行时电池放电维持直流侧电压稳定matlab/simulink仿真模型~ID:1639675030822110......
  • PWM脉宽信号隔离变送器
     PWM脉宽信号隔离变送器是指把PWM脉宽信号采集隔离转换成标准模拟量信号的小型仪器设备.定义: 英文PWM(PulseWidthModulation)什么是PWM:PWM是“脉宽调制”,脉宽顾名思义是脉冲的宽度,即时间t,“脉宽调制”理所当然就是改变t大小小,即时间的大小。当在改变t的大小时,一次所......
  • 一文梳理z-index和层叠上下文
    前言最近参与某前端项目架构改造,发现项目中滥用z-index,设置的值有几十种并且不统一。在对项目的z-index进行梳理和统一过程中也深入学习了一下z-index,并撰写成文,希望也能帮助到陌生的你。1、z-indexz-index属性是什么?这里可参考MDN:z-index属性设定了一个定位元素及其后代元......
  • SQLSERVER四种事务隔离级别
    SQLSERVER的四个事务隔离级别到底怎么理解? 一:背景1.讲故事在有关SQLSERVER的各种参考资料中,经常会看到如下四种事务隔离级别。READUNCOMMITTEDREADCOMMITTEDSERIALIZABLEREPEATABLEREAD随之而来的是大量的文字解释,还会附带各种 脏读, 幻读, 不可重复读 常......
  • 软件测试|一文告诉你SQL到底是什么
    前言我们在学习数据库时,第一个要弄明白的东西就是,SQL是什么,SQL是StructuredQueryLanguage的缩写,字面意思为“结构化查询语言”,它可以用来进行数据的查询、插入、更新、删除等操作,也可以用于创建和管理数据库对象,如表、视图、存储过程、函数等。本篇文章我们就将对SQL进行系统......
  • MySQL为什么使用可重复读隔离级别?
    历史原因:早期MySQL的binlog日志只有statement格式,在读已提交的隔离界别下,binlog日志存在bug,会导致主从复制不一致的情况。因此默认的隔离级别使用可重复读。bug:binlog日志中记录的语句顺序和原有顺序会不一致。先删除后插入的操作,同步导从库就变成了先插入后删除的操作了。MySQL......
  • IM开发者的零基础通信技术入门(十二):上网卡顿?网络掉线?一文即懂!
    【来源申明】本文引用了微信公众号“鲜枣课堂”的《上网慢?经常掉线?这篇文章告诉你该怎么办!》文章内容。为了更好的内容呈现,即时通讯网在引用和收录时内容有改动,转载时请注明原文来源信息,尊重原作者的劳动。1、本文内容概述对于不太了解网络通信的人来说(包括开发者),可能会经常碰......