请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

mysql中的锁机制之悲观锁和乐观锁

[复制链接]
查看: 31|回复: 0

1万

主题

2万

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
46413
发表于 2019-11-9 10:13 | 显示全部楼层 |阅读模式
1、灰心锁?

灰心锁望文生义就是很灰心,灰心锁以为数据随时就有大要会被外界举行点窜,所以灰心锁一上来就会把数据给加上锁。灰心锁一样平常都是依靠关系型数据库供给的锁机制,但是究竟上关系型数据库中的行锁,表锁不论是读写锁都是灰心锁。
2、悲观锁?

悲观锁望文生义,就是很悲观,每次自己操纵数据的时候以为没有人会来点窜它,所以不会去对数据举行加锁。可是在更新的时候会去判定在此时代数占有没有被点窜,需要用户自己去实现悲观锁。悲观锁不会发生并发抢占资本,只要在提交操纵的时候检查能否违反数据完整性。
2.1、为什么要利用悲观锁呢?

①、对于读操纵远多于写操纵的时候,大大都都是读取,这时候一个更新操纵加锁会阻塞全数读取,低落了吞吐量
②、末端还要开释锁,锁是需要一些开销的,我们只要想法子治理少少许的更新操纵的同步题目
③、换句话说,假如读写比例差异不好坏常大大要你的系统没有响应不实时,吞吐量瓶颈题目,那就不要去利用悲观锁,它增加了复杂度,也带来了额外的风险
2.2、悲观锁的实现方式

前期预备工作(预备数据表和测试数据):
  1. CREATE TABLE `employee`  (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `dep_id` int(11) NULL DEFAULT NULL,  `age` int(11) NULL DEFAULT NULL,  `salary` decimal(10, 2) NULL DEFAULT NULL,  `cus_id` int(11) NULL DEFAULT NULL,  `version` int(11) NULL DEFAULT NULL COMMENT '用来给悲观锁举行标识的字段',  PRIMARY KEY (`id`) USING BTREE,  INDEX `idx_name_age`(`name`, `age`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;  -- 插入测试数据INSERT INTO `employee` VALUES (1, '李白', 1, 10, 1000.00, 1, 1);INSERT INTO `employee` VALUES (2, '韩信', 1, 20, 2000.00, 1, 1);INSERT INTO `employee` VALUES (3, '露娜', 1, 20, 2500.00, 1, 1);INSERT INTO `employee` VALUES (4, '公孙离', 4, 20, 3000.00, 1, 1);INSERT INTO `employee` VALUES (5, '虞姬', 4, 40, 3500.00, 2, 1);INSERT INTO `employee` VALUES (6, '孙尚香', 6, 20, 5000.00, 1, 1);INSERT INTO `employee` VALUES (7, '马可波罗', 6, 50, 5000.00, 1, 1);INSERT INTO `employee` VALUES (8, '后羿', 30, 35, 4000.00, 1, 1);
复制代码
2.2.1、版本号的实现方式:
①、就是给数据增加一个版本标识,在数据表上增加一个version字段
②、每次更新把这个字段加1
③、读取数据的时候把version读出来,更新的时候比力version
④、假如照旧起头读取的version便可以更新了
⑤、假如现在的version比老的version大,说明有其他事务更新了该数据,并增加了版本号
⑥、这时候获得一个没法更新的看护,用户自行按照这个看护来决议怎样处置赏罚,比如重新起头一遍
版本号的方式实现悲观锁示例:
  1. -- 先获得version字段的值,这里version字段的值现在是:1SELECT version FROM employee WHERE id = 1; -- 更新该条数据的时候做数据考证,更新乐成后将version字段的值累加1,更新条件除了id还要加上version=上面取出来的值 才华举行更新UPDATE employee SET `name` = '李白大魔王',version = version + 1 WHERE id = 1 AND version = 1;
复制代码
示例截图:
mysql中的锁机制之悲观锁和乐观锁  游戏 1848951-20191108232244139-1569145997

2.2.2、时候戳的实现方式:
①、和上面的版本号底子一样,只是经过时代戳来判定而已,留意时候戳要利用数据库办事器的时候戳不能是营业系统的时候
②、一样是在需要悲观锁控制的table(表)中增加一个字段,字段称号无所谓
③、字段典范利用时候戳, 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时候戳和自己更新前取到的时候戳举行对照
④、假如同等则OK 实行更新操纵,否则就是版本辩说


免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表