当前位置: 首页 > news >正文

企业网站域名国内吃瓜爆料黑料网曝门

企业网站域名,国内吃瓜爆料黑料网曝门,网站优化qq群,凡科网是免费的吗mysql事务并发问题ACID什么的就不啰嗦了。mysql多个事务并发的时候#xff0c;可能会出现如下问题#xff1a;1. 更新丢失即两个事务同时更新某一条数据#xff0c;后执行的更新操作会覆盖先执行的更新操作#xff0c;导致先执行的更新结果丢失。2. 脏读即一个事务会读到另…mysql事务并发问题ACID什么的就不啰嗦了。mysql多个事务并发的时候可能会出现如下问题1. 更新丢失即两个事务同时更新某一条数据后执行的更新操作会覆盖先执行的更新操作导致先执行的更新结果丢失。2. 脏读即一个事务会读到另一个事务尚未提交的数据更新由于该数据更新可能会回滚所以称之为脏读。3. 不可重复读即一个事务中对同一行数据读取两次会得到不同的结果。原因是在该事务两次读取之间其他事务会修改此数据。4. 幻读即一个事务对同一个表执行两次查询会得到相同的结果行数。即使在该事务两次查询之间其他事务同时也向此表插入了新的数据。mysql事务隔离级别mysql共支持四种事务隔离级别分别是read uncommitted(读取未提交数据)从字面上理解该事务隔离级别允许读取未提交数据。仅处理更新丢失的问题但是不处理脏读、不可重复读、幻读的问题。read committed(读取已提交数据)从字面上理解该事务隔离级别允许读取已经提交的数据即未提交的数据不可读取。则该事务隔离级别处理更新丢失、脏读的问题不处理不可重复读、幻读的问题。repeatable read(重复读)该事务隔离级别无法从字面上理解了处理更新丢失、脏读、不可重复读的问题不处理幻读的问题。serializable(最高隔离级别)该事务隔离级别为最高事务隔离级别处理以上所有问题包括更新丢失、脏读、不可重复读、幻读。以上四种事务隔离级别依次递增事务隔离级别越高一致性越强可用性越差。可以看到所有的事务隔离界别都会处理更新丢失的问题。mysql默认的事务隔离级别为repeatable read即默认不处理幻读的问题。废话不多说直接上例子(大前提数据库引擎为innoDB)1. 首先要注意mysql自动提交事务要关闭查看mysql的autoCommit是否开启--查看mysql是否自动提交事务show variables like autocommit;如果需要关闭autoCommit则执行如下语句--关闭autoCommitset autocommit 0;2. 查看、设定mysql的事务隔离级别注意只在当前会话session有效。--查看当前数据库事务隔离级别select tx_isolation;--设定当前数据库隔离级别为 read uncommittedset session transaction isolation level read uncommitted;---set session transaction isolation level read committed ;--set session transaction isolation level repeatable read ;--set session transaction isolation level serializable;3. 创建测试表及测试数据usetest;create tabledt_table1 (idint auto_increment primary key,valuevarchar(50) null);insert into dt_table1 (value) value (00000000);insert into dt_table1 (value) value (00000000);insert into dt_table1 (value) value (00000000);(1)测试更新丢失我们先更新一下数据以便后续测试。update dt_table1 set value 00000000 where id 1;设定测试环境创建两个session连接并设定事务隔离级别 read uncommitedset session transaction isolation level read uncommitted;打开session连接1执行如下脚本通过第三步可以看到数据已经被更新start transaction; --第一步update dt_table1 set value update 1 where id 1; --第二步select * from dt_table1 where id 1; --第三步打开session连接2执行如下脚本当执行第五步的时候可以看到该更新操作被阻塞了。start transaction; --第四步update dt_table1 set value update 2 where id 1; --第五步回到session连接1执行commit可以看到session连接2中第五步的更新操作也取消了阻塞并执行通过了。commit; --第六步回到session连接2执行查询并commit。最终数据被更新为值‘update 2’。select * from dt_table1 where id 1; --第七步commit; --第八步通过以上的例子我们可以看出即使是mysql的最低事务隔离级别也解决了更新丢失的问题。即在session连接1中执行更新操作但尚未提交事务session连接2中的更新操作会被阻塞以避免session连接1中的更新丢失。将两个session连接的事务隔离级别设定为其他等级也会得到同样的结果。(2)测试脏读我们先更新一下数据以便后续测试。update dt_table1 set value 00000000 where id 1;设定测试环境创建两个session连接并设定事务隔离级别 read uncommited。在此事务隔离级别下会出现脏读的问题。set session transaction isolation level read uncommitted;打开session连接1执行如下脚本。start transaction; --第一步update dt_table1 set value read uncommitted where id 1; --第二步打开session连接2执行如下脚本。可以看到读取到了session连接1中已经更新但尚未提交的数据(查询值为‘read uncommited’)。select * from dt_table1 where id 1; --第三步回到session连接1执行rollback。rollback; --第四步回到session连接2再次执行查询可以看到查询值已经成功回滚(查询值为‘00000000’)select * from dt_table1 where id 1; --第五步通过以上的例子我们可以看出将mysql的事务隔离级别设定为read uncommited会出现脏读的问题。即session连接2中在第三步会读取到session连接1中已经更新但尚未提交的数据由于session链接1可能会发生事务回滚那么session连接2中读取到的数据也就无效了即读取脏数据即脏读。如果设定事务隔离级别为read commited或以上则不会出现此问题。上例中第三步读取到的值会为00000000。即不会脏读。(3)尝试不可重复读我们先更新一下数据以便后续测试。update dt_table1 set value 00000000 where id 1;设定测试环境创建两个session连接并设定事务隔离级别 read commited。在此事务隔离级别下会出现不可重复读情况。set session transaction isolation level read committed;打开session连接1执行如下脚本。可以看到查询值为‘00000000’start transaction; --第一步select * from dt_table1 where id 1; --第二步打开session连接2执行如下脚本。start transaction; --第三步update dt_table1 set value read committed where id 1; --第四步commit; --第五步回到session连接1执行如下脚本。可以看到查询值为‘read commited’select * from dt_table1 where id 1; --第六步commit; --第七步通过以上的例子我们可以看出将mysql的事务隔离级别设定为read commited会出现不可重复读问题即在session连接1中的一个事务中先后两次读取到的值不一样。原因是在该事务两次读取之间session连接2的事务修改并提交了此数据。如果设定事务隔离级别为repeatable read或以上则不会出现此问题。上例中第六步读取到的数据值依然为‘00000000’(4)尝试幻读设定测试环境创建两个session连接并设定事务隔离级别 repeatable read。在此事务隔离级别下会出现幻读的情况。set session transaction isolation level repeatable read ;我们先更新一下数据以便后续测试update dt_table1 set value 00000000 where 11;打开session连接1执行如下脚本。我们记录下第二步查询结果行数假如为n行。start transaction; --第一步select * from dt_table1; --第二步打开session连接2执行如下脚本。start transaction; --第三步insert into dt_table1 (value) value (phantom read new); --第四步commit; --第五步回到session连接1执行如下脚本可以看到第六步查询结果行数依然为n但是执行第七步更新操作的时候更新影响行数却是n1。执行第九步查询的时候结果行数也是n1select * from dt_table1; --第六步update dt_table1 set value phantom read where 11; --第七步commit; --第八步select * from dt_table1; --第九步通过以上的例子我们可以看出幻读问题的存在即第六步查询结果明明是n行但是第七步跟新操作影响行数却是n1难道是我的幻觉这就是幻读。如果设定事务隔离级别为serializable则不会出现此问题。第四步执行输入插入操作时会被阻塞第七步更新操作影响结果行数和第六步查询结果行数也会保持一致且执行到第九步的时候可以看到第四步新插入的数据也并没有被第七步更新掉。
http://www.zqtcl.cn/news/385126/

相关文章:

  • 做个响应式网站多少钱河南网络推广系统
  • wordpress的后台文章图文发布清远市seo广告优化
  • 长沙的互联网网站公司招标文件免费下载网站
  • icp备案系统网站品网站建设公司排名
  • 什么网站可以做音乐相册可信的品牌网站建设
  • 洛阳网站建设优惠公司网站查询ip地址
  • 学校网站模版电影网站要怎样做才有出路
  • 无锡网站建设 微信企业网站建设与管理期末考试
  • 海南海口网站开发公司怎么建立微网站?
  • 网站建设 鄂icp备app 微网站
  • 西安做网站seo网站站内优化怎么做
  • 建设网站方案公司wordpress 视差主题
  • 网站 建设 语言wordpress同步
  • 三水 网站建设建设部网站网上大厅
  • 深圳高端企业官方网站建设最好的网站设计开发公司
  • 主流大型网站开发语言调查怀柔富阳网站建设
  • 公司网站建设服务类别最便宜云主机永久免费
  • 心悦dnf免做卡网站竞价恶意点击犯法吗
  • 企业网站的类型包括无锡专业网站建设
  • 手机版刷赞网站建设软文代写文案
  • 网站内容与目录结构色一把做最好的网站
  • 优化网站方法企业做网站属于广告宣传费吗
  • 站长之家alexa排名网站架构 seo
  • 四川智能网站建设制作建设网站代理
  • 对网站建设好学吗智慧企业解决方案
  • 网站建站平台eazyshoph5制作微信小程序
  • 扬中网站建设 优帮云望野古诗带拼音
  • 网站和discuz同步登录建设产品网站课程
  • 常州做网站多少钱图片链接在线生成器
  • 服务器网站打不开可以做哪些网站