数据库并发控制、悲观锁(Pessimistic Lock)、乐观锁(Optimistic Lock)、排他锁(Exclusivelocks X锁)、共享锁(Shared Lock S锁)
文章目录
- 5.数据库并发控制
- 5.5锁
- 5.5.1 共享锁(Shared Lock S锁)
- 5.5.1.1数据准备
- 5.5.1.2展示
- 5.5.2 排他锁(Exclusivelocks X锁)
5.数据库并发控制
5.5锁
从数据库系统角度
5.5.1 共享锁(Shared Lock S锁)
读锁,保证数据只能读取,不能被修改。
如果事务A对emp1表加上S锁,则事务A可以读emp1表但不能修改emp1表,其他事务(这里用事务B)只能对emp1表再加上S锁,不能加X锁,直到事务A释放了emp1表上的S锁,保证了其他事务(事务B)可以读emp1表,但在事务A释放emp1表上的S锁之前不能对emp1表进行任何修改。
5.5.1.1数据准备
CREATE TABLE emp1(id INT PRIMARY KEY,name VARCHAR(20),sal INT
);INSERT INTO emp1 VALUES(1,'张三',15000),(2,'李四',20000);
5.5.1.2展示
- 1.打开两个cmd,然后进入mysql里面
以下操作两个cmd都需要操作
mysql -u root -p
- 2.查询事务提交模式
1为自动提交,2为手动提交。
3.设置事务为手动提交,方便证明上诉结论(mysql默认为自动提交,执行单句sql其实包含 开启事务,执行sql,提交事务,3个步骤)。
4.客户端A开启一个事务A。
5.客户端A给emp1表加上读锁。
6.查询emp1表原有的数据(加上S锁后,可以读数据)。
- 7.事务A修改数据(加上S锁后,无法修改数据)。
8.B客户端开启事务B。
9.事务B对emp1查询(因为是S锁,其他事务可以对记录A进行SELECT )。
10.事务B对记录emp1加读锁(事务A对记录A加上S锁后,事务B同样也可以对记录A加上S锁,证明了,MySQL里的读锁就是S锁,具有共享)。
11.事务B对记录emp1加写锁(一直处于等待状态,被挂起
12.事务B对记录emp1修改(一直处于等待状态,被挂起)。
- 13.事务A释放emp1上的S锁。
此时事务B才得到响应。
说明了,只有释放了读锁,另外一个事务才能加写锁,或者更新数据。
5.5.2 排他锁(Exclusivelocks X锁)
写锁,若事务A对emp1表加上X锁,事务A可以读emp1表也可以修改emp1表,其他事务(事务B)不能再对emp1表加任何锁,直到事务A释放emp1表上的锁,保证了其他事务(事务B)在事务A释放emp1表上的锁之前不能再读取和修改emp1表。
- 1.客户端A设置手动提交,并且开启事务A。
2.客户端B设置手动提交,并且开启事务B。
3.事务A给emp1表加上X锁。
4.事务A可以读emp1表也可以修改emp1表。
5.事务B不能对emp1表加任何锁。
6.事务B也不能对emp1表进行查询和修改。
7.事务A释放emp1表上的X锁。
8.事务B阻塞的进程被执行,中断了9.69秒。
从程序员角度
悲观锁(Pessimistic[ˌpesɪˈmɪstɪk] Lock)
对数据被外界修改保持保守态度,在整个数据处理过程中,数据处于锁定状态,依赖于数据库提供的锁机制。乐观锁(Optimistic[ˌɑ:ptɪˈmɪstɪk]Lock)
采用宽松的加锁机制,基于数据版本记录机制,具体做法:数据库表增加一个"version"字段来实现,读取数据时,将版本号一同读出,之后更新,对版本号加1,将提交数据的版本数据与数据库对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库的数据,则予以更新,否则,被认为是过期数据。
数据库并发控制、悲观锁(Pessimistic Lock)、乐观锁(Optimistic Lock)、排他锁(Exclusivelocks X锁)、共享锁(Shared Lock S锁)相关推荐
- 数据库并发控制,选择乐观锁还是悲观锁?
出处:http://www.cnblogs.com/chenlulouis/ 今天,在这里,我们将讨论的是在实际生产过程中,对于并发控制你是选择乐观锁还是悲观锁.这两种锁各自的应用环境应该怎样选择? ...
- 数据库的悲观锁、乐观锁
目录 并发控制 数据库锁的常见分类 悲观锁 Pessimistic Lock 乐观锁 Optimistic Lock 悲观锁.乐观锁的比较.选择 并发控制 并发情况下,需要做一些控制(加锁),保证 ...
- mysql 并发控制--悲观锁和乐观锁
悲观锁,乐观锁,只适用于更新操作 实际生产环境里边,如果并发量不大,完全可以使用悲观锁定的方法,这种方法使用起来非常方便和简单. 但是如果系统的并发非常大的话,悲观锁定会带来非常大的性能问题,所以就要 ...
- 聊一聊数据库中的锁分类(乐观锁、悲观锁、共享锁、排它锁、表级锁、行级锁、页面锁)...
乐观锁和悲观锁(从策略上划分) 乐观锁:乐观锁就如同他的名字一样,非常了乐观,每次去读数据都认为其它事务没有在写数据,总是认为别人不会修改数据,所以就不上锁,只有在线程提交数据时会通过检查版本号的形式 ...
- 【数据库】悲观锁与乐观锁的理解和实现
什么是乐观锁和悲观锁?这其实是人们定义出的一种思想,可以对应为在生活中乐观的人和悲观的人.乐观锁总是相信最好的情况,去相信别人不会修改自己的数据,在每次取数据的时候都不会上锁,因此比较适用于读多写少的 ...
- MySql悲观锁(行锁)和乐观锁
什么是乐观锁,什么是悲观锁? 一.并发控制 当程序中可能出现并发的情况时,就需要保证在并发情况下数据的准确性,以此确保当前用户和其他用户一起操作时,所得到的结果和他单独操作时的结果是一样的.这就叫做并 ...
- java中乐观锁_Java中乐观锁与悲观锁的实现
锁(locking) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中 (可能是几秒种, ...
- 并发执行变成串行_大神浅谈数据库并发控制 锁和 MVCC
在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制.  如果数据库中的所有事务 ...
- 浅谈数据库并发控制 - 锁和 MVCC
文章写得不错,原文地址见 http://draveness.me/database-concurrency-control.html 在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案, ...
- mysql行锁还需要乐观锁吗_mysql行锁、表锁。乐观锁,悲观锁
锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...
最新文章
- 拥抱高效、拥抱 Bugtags 之来自用户的声音(三)
- Linux 安装iostat命令
- FastDFS_install_document_detail
- JDB2导致磁盘io使用率高
- QueryList 配置curl参数 的文档位置 QueryList抓取https 终于找到了
- git实现审核功能_一文教你如何搭建PDD分佣小程序实现财富自由
- WN7 上IIS7运行asp+access网站出现错误: ADODB.Connection 错误 '800a0e7a'未找到提供程序。该程序可能未正确安装
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED模板驱动程序的改造:设备树
- 【ElasticSearch】Es 启动流程 初始化流程 源码分析
- Vuejs 使用 lib 库模式打包 umd 解决 NPM 包发布的问题
- 快速记下html css,如何快速记住及输入CSS样式属性单词?
- CSS实例——远视图
- 【软件工程】工程思维的价值
- 为什么有的chm会显示“已取消到该网页的导航”?
- 71、不同灭火器的适用范围
- 苹果6系统怎么更新不了_苹果手机系统怎么降级
- androidsettitle方法_在Android应用程序中,Toolbar.setTitle方法无效 - 应用程序名称显示为ti...
- 程序员找如何才能找到传说中的女朋友?
- java实现getch_Java中是否有C++中的getch()等效项? - java
- 用java写一个汽车加油的程序_Java实现 LeetCode 134 加油站