首页 文章 精选 留言 我的

精选列表

搜索[mysql],共10000篇文章
优秀的个人博客,低调大师

MySQL数据库select for update探究

针对select for update的原理,在网络上有很多文章都有讲过,具体的用法也有文章进行讲解,其中也不乏一些优秀的文章。但是针对于具体的使用中的表现并没有太多。 本篇博客以select for update与update的执行表现为例,记录实际使用过程中的心得。本篇不讲原理,只讲表现。 阅读必知 使用sql命令窗口一,执行select for update,关闭事务的自动提交,模拟在系统中开启了事务,以下简称“事务一”。 使用sql命令窗口二,执行update,同样关闭事务的自动提交,模拟在系统中开启了事务。update的操作也可以是事务自动提交的,但是为了更清楚的描述发生了什么,所以也关闭了事务的自动提交,以下简称“事务二”。 事务级别:RR——可重复读。 测试过程 第一种情况,select for update执行在“update与update的commit”之间 查看数据的当前状态,使用事务一或事务二均可 ↓ 事务一,关闭事务的自动提交 ↓ 事务二,关闭事务的自动提交 ↓ 事务二,执行update,将status值修改为10 ↓ 可以看到,此时update语句是可以正常执行的,但此时事务二是未提交的。 事务一,执行select,查询当前的status值 ↓ 因为事务二还未提交,所以此时可以看到事务一查询到的status的旧值。 事务一,执行select for update,查询当前的status值 ↓ 因为事务二,还未提交,所以事务一中执行的select for update是被阻塞的,并没有打印查询结果。 事务二,执行commit,将修改提交 ↓ 此时去看事务一的窗口,发现select for update的结果已经正常打印出来,且status的值为update修改的值。 情况一总结:select for update执行在“update与update的commit”之间时,update的事务在未提交之前,会阻塞select for update的执行,只有update的事务提交之后,select for update才能正常返回结果。 情况二,update执行在“select for udpate与select for update的commit”之间 查看数据的当前状态,使用事务一或事务二均可 ↓ 事务一,关闭事务的自动提交 ↓ 事务二,关闭事务的自动提交 ↓ 事务一,执行select for update,但未commit ↓ 结果可以正常返回,但此时已经开启了一个锁,锁定了数据。 事务二,执行update,修改status的值为10 ↓ 因为事务一没有提交,所以事务一持有锁,事务二的update会被阻塞。 事务一,执行commit ↓ 事务一执行commit,此时可以看到事务二的阻塞被解除,修改生效,但此时的update依旧是未commit的 ↓ 事务一,执行select,读取到status的旧值:100 ↓ 因为事务一没有commit,所以select查询到的是旧值,即status=100。若此时执行select for update,则进入到了情况一所描述的情况,在此不再展开。 事务二,执行commit ↓ 事务一,再次执行select,读到status的值:100 ↓ 因为数据库的事务级别是RR的,所以这个地方读取到的还是100。 事务一,执行一次commit后再执行select,读取status的新值:10 ↓ 情况二总结:update执行在“select for update与select for update的commit”之间时,select for update的事务在未提交之前,会阻塞update的执行,只有select for update的事务提交之后,update才能正常返回结果。 总结:select for update执行的是当前读。

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册