脏读,不可重复读,幻读 ,mysql5.7以后默认隔离级别是什么?什么是qps,tps,并发量,pv,uv、什么是接口幂等性问题,如何解决?
一、脏读,不可重复读,幻读 ,mysql5.7以后默认隔离级别是什么?
程序访问数据库,往往是多个线程并发执行多个事务,数据库要能进行隔离操作,以保证各个线程获取数据的准确性,所以,对于不同的事务,采用不同的隔离级别会有不同的结果。
如果不考虑事务的隔离性,会发生 几种问题
脏写(Dirty Write)
如果一个事务修改了另一个事务提交修改过的数据,就意味着发生了脏写现象。
脏读(Dirty Read)
如果一个事务读到了另一个未提交事务修改过的数据,就意味着发生了脏读现象。
不可重复读
如果一个事务修改了另一个未提交事务读取的数据,就意味着发生了不可重复读现象。
幻读
如果一个事务先根据某些查询条件查询出一些记录,在该事务未提交时,另一个事务写入了一些符合那些收缩条件的记录(这里指INSERT,DELETE,UPDATE 操作),就以为着发生了幻读现象
脏读,不可重复读,幻读
脏读
脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读
脏读最大的问题就是可能会读到不存在的数据。比如在上图中,事务B的更新数据被事务A读取,但是事务B回滚了,更新数据全部还原,也就是说事务A刚刚读到的数据并没有存在于数据库中。 从宏观来看,就是事务A读出了一条不存在的数据,这个问题是很严重的
不可重复读
不可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况
事务 A 多次读取同一数据,但事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致
幻读
幻读错误的理解
幻读是 事务A 执行两次 select 操作得到不同的数据集,即 select 1 得到 10 条记录,select 2 得到 15 条记录。 这其实并不是幻读,既然第一次和第二次读取的不一致,那不还是不可重复读吗,所以这是不可重复读的一种。
正确的理解
幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。
更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读
查的时候明明没有这条记录,但插入的时候 却告诉我 主键冲突,这就好像幻觉一样。
这才是所有的幻读。 不可重复读侧重表达 读-读,幻读则是说 读-写,用写来证实读的是鬼影
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 前端:按钮只能点击一次