今天在看同事程序的时候,看到这种用法,顺便学习下。

一:理论

1.功能

  这个功能是上锁。

  上的是一个排它锁,也就是说,其他的事务是可以读取的。但是不能写入或者更新。

二:实践

1.创建表

  

2.提交一条记录

  

3.将自动提交关闭

  然后插入一条数据。

  

4.再启动一个客户端,进行查询

  会发现,这里的值被查询出来还是10,因为没有提交。

  

5.操作人员2发现数据不对,然后发起修改。

  但由于会话1中对该行记录的修改未提交,所以,排它锁并没有释放,因而操作人员2发起的这个修改操作会等待,直至会话1释放该锁(提交或回滚)。

  

6.然后会话1进行提交,并查询

  这个时候,结果是对的。

  

7.提交会话2的修改

  

8.再次查询结果

  

三:解决方式

1.解决方式

  在我们试图修改某个记录时,先利用select ... from xxx where zzz for update;将该记录加锁。这样,就可以确保我现在看到的值,一定不会再被其他人修改了。

2.会话1

  

3.会话2

  

4.等会话1commit了

  会将结果查询出来。

  

5.再进行提交

  这个时候,会在最新的基础上进行新增。

  与刚才的区别:

  这个查询的结果,是15,而刚才的查询结果确是10.

  因为这里有一段时间再等待,这个行记录被锁定。

四:需要注意的地方

1.是否根据主键决定是否锁表

  选中某一个行的时候,如果是通过主键id选中的。那么这个时候是行级锁。 其他的行还是可以直接insert 或者update的。
  如果是通过其他的方式选中行,或者选中的条件不明确包含主键。这个时候会锁表。其他的事务对该表的任意一行记录都无法进行插入或者更新操作。只能读取。

035 控制并发 select * from test1 where id =1 for update 就会对这行加锁了?的更多相关文章

  1. MySQL如何加锁控制并发

    目录 前言 一.乐观锁 添加version字段 二.悲观锁 读锁 全表锁(LOCK TABLE 表 READ) 行锁(SELECT ... LOCK IN SHARE MODE) 写锁 全表锁(LOC ...

  2. Nodejs - 如何用 eventproxy 模块控制并发

    本文目标 本文的目标是获取 ZOJ 1001-1010 每道题 best solution 的作者 id,取得数据后一次性输出在控制台. 前文 如何用 Nodejs 分析一个简单页面 我们讲了如何用 ...

  3. mysql 限制并发select patch

    限制并发select的patch,代码量很少,主要是为了学习mysql的源码,yy一下. 增加两个全局控制变量: thread_limit_min thread_limit_max 增加一个条件变量: ...

  4. java并发编程学习:用 Semaphore (信号量)控制并发资源

    并发编程这方面以前关注得比较少,恶补一下,推荐一个好的网站:并发编程网 - ifeve.com,上面全是各种大牛原创或编译的并发编程文章. 今天先来学习Semaphore(信号量),字面上看,根本不知 ...

  5. Java--Semaphore控制并发线程数量

    package com; import java.util.concurrent.Semaphore; /** * Created by yangyu on 16/11/28. */ /** * Se ...

  6. entity framework如何控制并发

     entity framework如何控制并发 针对字段http://msdn.microsoft.com/en-us/library/vstudio/bb738618(v=vs.100).aspx ...

  7. async和enterproxy控制并发数量

    聊聊并发与并行 并发我们经常提及之,不管是web server,app并发无处不在,操作系统中,指一个时间段中几个程序处于已经启动运行到完毕之间,且这几个程序都是在同一处理机上运行,并且任一个时间点只 ...

  8. [Go] golang无缓冲通道实现工作池控制并发

    展示如何使用无缓冲的通道创建一个goroutine池,控制并发频率1.无缓冲通道保证了两个goroutine之间的数据交换2.当所有的goroutine都忙的时候,能够及时通过通道告知调用者3.无缓冲 ...

  9. nodejs高并发大流量的设计实现,控制并发的三种方法

    nodejs高并发大流量的设计实现,控制并发的三种方法eventproxy.async.mapLimit.async.queue控制并发Node.js是建立在Google V8 JavaScript引 ...

随机推荐

  1. python-函数入门(二)

    一.函数对象 什么是函数? 函数是第一类对象,指的是函数名指向的值(函数)可以被当做数据去使用 1.函数的特性 1.函数可以被引用,即函数可以把值赋值给一个变量 def foo(): print('f ...

  2. Codeforces 1110D Jongmah [DP]

    洛谷 Codeforces 我-我我把这-这这题切了??? 说实话这题的确不难,只是我看到有大佬没做出来有点慌-- 突然发现这题是我在洛谷的第500个AC呢.那就更要写篇题解纪念一下了. 思路 容易想 ...

  3. Poco::Crypto--加解密(AES)

    Poco::Crypto--加解密(AES) 1 int main(const std::vector<std::string>& args) 2 { 3 /*TO DO*/ 4 ...

  4. Confluence 6 属性的一个活动

    为了启用属性,使用上面描述的方法.针对所有的用户,属性每一个访问的页面,将会在你的应用服务器中进行记录,直到你对 Confluence 进行重启.请注意每次用户访问一个链接,一个单一的属性将会被打印出 ...

  5. Confluence 6 配置白名单

    Confluence 管理员可以通过添加 URLs 到白名单选择出入的链接和使用 RSS 宏,HTML 包含宏和小工具中的内容. 如果一个内容被添加到 Confluence 系统中,但是这个 URLs ...

  6. django 中自带的加密方法

    导入django 自带的加密算法 和flask中的哈希加密有一曲同工之妙.        from django.contrib.auth.hashers import make_password, ...

  7. Memcached常用语法与java连接服务

    memcached常用语法及java使用方式 Author:SimpleWu Memcached 存储命令 Memcached set 命令用于将 value(数据值) 存储在指定的 key(键) 中 ...

  8. CentOS 7 安装 Redis

    1.Redis 下载地址:https://redis.io/download 2.上传到服务器指定文件夹 ,我这边传到了根目录下 /mysoft 这个目录下 解压  tar  -zxvf redis- ...

  9. Centos + docker,Ubuntu + docker介绍安装及详细使用

    docker笔记 常用命令 设置docker开机自启:sudo chkconfig docker on 查所有镜像: docker images 删除某个镜像:docker rmi CONTAINER ...

  10. MVC AOP解决JsonResult返回json时间格式

    新建JsonNetResult类:JsonResult public class JsonNetResult: JsonResult { public JsonNetResult() { Settin ...