首页 > 数据库 >脏读,不可重复读,幻读 ,mysql5.7以后默认隔离级别是什么?什么是qps,tps,并发量,pv,uv、什么是接口幂等性问题,如何解决?

脏读,不可重复读,幻读 ,mysql5.7以后默认隔离级别是什么?什么是qps,tps,并发量,pv,uv、什么是接口幂等性问题,如何解决?

时间:2023-07-31 21:22:49浏览次数:43  
标签:事务 pv 隔离 幻读 uv 重复 脏读 数据

目录

一、脏读,不可重复读,幻读 ,mysql5.7以后默认隔离级别是什么?

程序访问数据库,往往是多个线程并发执行多个事务,数据库要能进行隔离操作,以保证各个线程获取数据的准确性,所以,对于不同的事务,采用不同的隔离级别会有不同的结果。

如果不考虑事务的隔离性,会发生 几种问题

脏写(Dirty Write)
如果一个事务修改了另一个事务提交修改过的数据,就意味着发生了脏写现象。
脏读(Dirty Read)
如果一个事务读到了另一个未提交事务修改过的数据,就意味着发生了脏读现象。
不可重复读
如果一个事务修改了另一个未提交事务读取的数据,就意味着发生了不可重复读现象。
幻读
如果一个事务先根据某些查询条件查询出一些记录,在该事务未提交时,另一个事务写入了一些符合那些收缩条件的记录(这里指INSERT,DELETE,UPDATE 操作),就以为着发生了幻读现象

脏读,不可重复读,幻读

脏读

脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读
image
脏读最大的问题就是可能会读到不存在的数据。比如在上图中,事务B的更新数据被事务A读取,但是事务B回滚了,更新数据全部还原,也就是说事务A刚刚读到的数据并没有存在于数据库中。 从宏观来看,就是事务A读出了一条不存在的数据,这个问题是很严重的

不可重复读

不可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况
image
事务 A 多次读取同一数据,但事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致

幻读

幻读错误的理解

幻读是 事务A 执行两次 select 操作得到不同的数据集,即 select 1 得到 10 条记录,select 2 得到 15 条记录。 这其实并不是幻读,既然第一次和第二次读取的不一致,那不还是不可重复读吗,所以这是不可重复读的一种。

正确的理解

幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。

更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读
image
查的时候明明没有这条记录,但插入的时候 却告诉我 主键冲突,这就好像幻觉一样。

这才是所有的幻读。 不可重复读侧重表达 读-读,幻读则是说 读-写,用写来证实读的是鬼影

mysql5.7以后默认隔离级别是什么

	-脏读:指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读
    -不可重复读:指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况
    -幻读:并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读
Oracle仅支持两种隔离级别:Read Committed与Serializable,默认基本为RC

Mysql的InnoDB 引擎才支持事务,默认事务隔离级别为:REPEATABLE READ(可重复读)-RR

在RR这一隔离级别下,只能解决部分幻读问题,不能解决全部的幻读问题

二、什么是qps,tps,并发量,pv,uv

-qps:Queries Per Second,每秒查询率,一台服务器每秒能够响应的查询次数
-tps:Transactions Per Second,是每秒处理的事务数,包括一条消息入和一条消息出,加上一次用户数据库访问
-并发量:系统同时处理的请求数量
-PV(Page View):页面访问量,即页面浏览量或点击量,用户每次刷新即被计算一次。可以统计服务一天的访问日志得到
-UV(Unique Visitor):独立访客,统计1天内访问某站点的用户数。可以统计服务一天的访问日志并根据用户的唯一标识去重得到
-DAU(日活)DAU(Daily Active User),日活跃用户数量。常用于反映网站、app、网游的运营情况。DAU通常统计一日(统计日)之内,登录或使用了某个产品的用户数(去除重复登录的用户),与UV概念相似
-MAU(Month Active User):月活跃用户数量,指网站、app等去重后的月活跃用户数量

三、什么是接口幂等性问题,如何解决?

-幂等:幂等(idempotent、idempotence)是一个数学与计算机学概念
-一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同
-接口幂等性:无论调用多少次,产生的效果是一样的
	-get 获取数据天然幂等
    -put 修改数据天然幂等
    -delete 删除 天然幂等
    -post 新增数据,会出现不幂等的情况,要把它做成幂等性的
    	-解决:
        	1 唯一主键 unique  新增用户用用户名唯一,但是订单问题解决不了
            2 token机制,随机字符串
            	-在使用新增之前,先生成一个随机字符串token,保存起来,只要调用新增接口,就必须携带随机字符串token,到后端,校验这个token在不在我们保存的里面,如果在,说明正常,立马删除token,允许新增,如果不在就不允许新增
            3 前端:按钮只能点击一次

标签:事务,pv,隔离,幻读,uv,重复,脏读,数据
From: https://www.cnblogs.com/yuezongke/p/17594525.html

相关文章

  • UVM:3.3.2 field_automation 机制常用的函数
    1.copy要把A的实例复制到B实例中,应该使用B.copy(A),使用前,B必须使用new分配好内存空间。2.compare比较A与B是否一样,可以使用A.compare(B),也可以使用B.compare(A)。相等时,返回1;否则为0。3.pack_bytes将所有字段打包成bytes流。返回的是size。4.unpack_bytes:将byte流逐一恢复到某个cla......
  • UVM:2.1_验证平台的组成
    1.首先看下面的结构吧:这个结构虽然不是一个严格满足官方规范的架构,但它真的可以跑.1).driver:产生最原始的data,发送给两部分。一个是DUT,另一个是referencemodel。2) referencemodel:是一个和DUT逻辑上相同的模块,可以sv,也可以通过DPI实现。我遇到的问题是,如果referencemodel和DU......
  • UVM:5.1.6 build 阶段出现UVM_ERROR停止仿真
    1.在build_phase使用uvm_error,也会退出:2.结果:3.在end_of_elaboration_phase之前的phase中,如果出现UVM_ERROR,UVM就认为出现了致命错误,会调用uvm_fatal结束仿真。4.小设计看不出优势,大设计有用。......
  • UVM:3.4.2 重载打印信息的严重性
    1.所有warning替换成error:2.只对某个特定id起作用:3.重载严重性是没有递归函数的。4.可以在命令行中实现:<simcommand>+uvm_set_severity=<comp>,<id>,<currentseverity>,<new_severity><simcommand>+uvm_set_severity="uvm_test_top.env.i_agt.drv,my_driver,......
  • UVM:4.1.1 验证平台内部的通信
    1.两个components通信可以有如下方法:1)设置全局变量。2)设置public让外部访问。3)写一个新的class,uvm_object,用config_db(config_object)配置,被配置的components去吃这个新的class。但是都不好!!!!!!!!!!!!!!!!2.1)上面的方法如果加入阻塞和非阻塞的概念,会更复杂。2)scoreboard主动要求数据,又怎么实现......
  • UVM:5.1.8 phase 机制的必要性
    1.可以这么写:第三行在第二行后面就可以。2.将顺序降到最低,也可以这么写:3.UVM将例化放在build_phase,连接放在connect_phase,这就是phase的来源。方便用户。......
  • UVM:4.1.3 UVM 中的PORT 与 EXPORT
    1.UVM中常用的PORT有:总结到一起:1)put,get,transport都是3个。2)peek与get类似,都是主动获取数据。是有区别的。。。3)get_peek结合了get和peek的功能。4)前12个的参数就是PORT中的数据类型,后3个是request的类型和response的类型。5)如果没有指定是否阻塞,则都可以当。(都可以作只是端口......
  • 7.kubernetes存储卷、持久卷、pv和pvc、NFS CSI部署示例
    pod资源规范总结资源类型获取:kubectlaip-resources资源群组获取:kubectlaip-versions特定资源的规范获取:kubectlexplain<Kind>.pod运行自主式pod,非受控于工作负载型控制器直接由kubelet管理apiVersion:v1kind:Po......
  • UVM:6.3.3 uvm_rand_send 系列宏
    1.uvm_rand_send系列宏有如下几个:1)和uvm_send的唯一区别是它会对transaction进行随机化。2)使用前提是transaction被分配了空间,(就是uvm_create)2.uvm_rand_send系列宏及uvm_send系列宏的意义在于,如果一个transaction占用内存较大,希望前后两次发送的transaction都是用同一块内......
  • UVM:6.4.4 p_sequencer 的使用
    1.考虑如下情况,sequencer有如下变量:2.在sequence发送transaction时,必须设置此dmac和smac,sequence的body如何得到这两个值呢?1)在介绍sequence时,内部有m_sequencer,直接使用m_sequencer得到这两个变量:编译错误:因为m_sequencer是uvm_sequencr_base(uvm_sequencr的基类)类型,而不......