Mysql中悲观锁与乐观锁应用介绍_MsSql

来源:脚本之家  责任编辑:小易  
目录
1.锁2.悲观锁3.乐观锁4.如何选择

1.锁

? 生活中:锁在我们身边无处不在,比如我出门玩去了需要把门锁上,比如我需要把钱放到保险柜里面,必须上锁以保证我财产的安全。

代码中:比如多个线程需要同时操作修改共享变量,这时需要给变量上把锁(syncronized),保证变量值是对的。

数据库表:当多个用户修改表中同一数据时,我们可以给该行数据上锁(行锁)。

sql脚本

CREATE TABLE `sys_user` (
  `id` bigint(20) NOT NULL COMMENT '主键ID',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  `deleted` tinyint(1) DEFAULT NULL COMMENT '是否删除',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `create_id` bigint(20) DEFAULT NULL COMMENT '创建人',
  `update_id` bigint(20) DEFAULT NULL COMMENT '操作人',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `status` varchar(255) DEFAULT NULL COMMENT '状态',
  `dog` text DEFAULT NULL COMMENT '狗',
  `version` int(11) DEFAULT NULL COMMENT '版本号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `sys_user`(`id`, `name`, `age`, `email`, `deleted`, `create_time`, `create_id`, `update_id`, `update_time`, `status`, `dog`, `version`) VALUES (1, 'gukong', 19, 'test1@baomidou.com', 0, NULL, NULL, NULL, NULL, NULL, NULL, 0);

2.悲观锁

? 当我们要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发的发生。

为什么叫做悲观锁呢?因为这是一种对数据的修改抱有悲观态度的并发控制方式。我们一般认为数据被并发修改的概率比较大,所以需要在修改之前先加锁。

数据库中的行锁,表锁,读锁,写锁,以及 syncronized 实现的锁均为悲观锁。

mysql开启悲观锁,示例sql语句

--开启事务
BEGIN
--对行加锁
SELECT * FROM `sys_user` where id = 1 for UPDATE
--修改加锁行的数据
update sys_user set name = 'gukong',age = 18 where id = 1;
--提交事务
commit;
--开启事务
BEGIN
--对行加锁
SELECT * FROM `sys_user` where id = 1 for UPDATE
--修改加锁行的数据
update sys_user set name = 'kulilin',age = 20 where id = 1;
--提交事务
commit;
update sys_user set name = 'kulilin',age = 20 where id = 1;

3.乐观锁

? 乐观锁是对于数据冲突保持一种乐观态度,操作数据时不会对操作的数据进行加锁,只有到数据提交的时候才通过一种机制来验证数据是否存在冲突。

乐观锁通常是通过在表中增加一个版本(version)或时间戳(timestamp)来实现,其中,版本最为常用。

乐观锁每次在执行数据的修改操作时,都会带上一个版本号,一旦版本号和数据的版本号一致就可以执行修改操作并对版本号执行 +1 操作,否则就执行失败。

乐观锁示例:

-- version = 0
SELECT * FROM `sys_user` where id = 1 
update sys_user set name='小明',version = version+1 and age = 20 where id = 1 and version = 0;
-- version = 0 ,而此时version=1,更新失败
SELECT * FROM `sys_user` where id = 1 
update sys_user set name = '小红' version = version+1 and age = 25 where id = 1 and version = 0;

4.如何选择

乐观锁适用于读多写少的场景,可以省去频繁加锁、释放锁的开销,提高吞吐量

在写比较多的场景下,乐观锁会因为版本不一致,不断重试更新,产生大量自旋,消耗 CPU,影响性能。这种情况下,适合悲观锁

到此这篇关于Mysql中悲观锁与乐观锁应用介绍的文章就介绍到这了,更多相关Mysql悲观锁与乐观锁内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

您可能感兴趣的文章:一文搞懂Mysql中的共享锁、排他锁、悲观锁、乐观锁及使用场景MySQL悲观锁与乐观锁的实现方案MySQL中的乐观锁,悲观锁和MVCC全面解析MySQL中的悲观锁与乐观锁mysql 悲观锁与乐观锁的理解及应用分析Mysql悲观锁和乐观锁的使用示例实例讲解MySQL中乐观锁和悲观锁

  • 本文相关:
  • sql server使用导出向导功能
  • sqlserverdriver配置方法 jdbc连接sqlserver
  • 判断数据库表是否存在以及修改表名的方法
  • mssql 游标使用 心得
  • sql按照日、周、月、年统计数据的方法分享
  • 根据日期知道当天是星期几的手动计算方法
  • sqlserver数据库危险扩展删除和恢复代码
  • sql server数字开头的数据库表名的解决方法
  • sql存储过程获取汉字拼音头字母函数
  • sql server 视图数据的增删改查教程
  • mysql数据库怎么设置乐观锁
  • mysql默认是乐观锁?
  • 为何Redis用乐观锁,而MySQL数据库却没有
  • Mybatis 如何使用 Mysql 悲观锁,求解答
  • Mybatis 如何使用 Mysql 悲观锁,求解答
  • 你需要理解的关于MySQL的锁知识
  • mysql数据库锁的产生原因及解决办法
  • Mysql主键和唯一键的区别点总结
  • MySQL limit性能分析与优化
  • Java如何实现对Mysql数据库的行锁
  • MySQL与PostgreSQL相比哪个更好
  • mysql是如何解决脏读,不可重复读,幻读
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mssql一文搞懂mysql中的共享锁、排他锁、悲观锁、乐观锁及使用场景mysql悲观锁与乐观锁的实现方案mysql中的乐观锁,悲观锁和mvcc全面解析mysql中的悲观锁与乐观锁mysql 悲观锁与乐观锁的理解及应用分析mysql悲观锁和乐观锁的使用示例实例讲解mysql中乐观锁和悲观锁sql server使用导出向导功能sqlserverdriver配置方法 jdbc连接sqlserver判断数据库表是否存在以及修改表名的方法mssql 游标使用 心得sql按照日、周、月、年统计数据的方法分享根据日期知道当天是星期几的手动计算方法sqlserver数据库危险扩展删除和恢复代码sql server数字开头的数据库表名的解决方法sql存储过程获取汉字拼音头字母函数sql server 视图数据的增删改查教程sql server 2012 安装图解教程(附sql201sql server数据库入门学习总结microsoft sql server 2012 数据库安win7系统安装sqlserver2000的详细步骤(图文)sql重复记录查询的几种方法sqlserver中distinct的用法(不重复的记录)ddl、dml和dcl的区别与理解sql server错误代码大全及解释(留着备用)sql-order by 多字段排序(升序、降序)sql将一个表中的数据插入到另一个表中的方法sql 查询慢的原因分析sum(case when then)(判断男女生的个数)sql server中聚合历史备份信息对比数据库增长的方法sql server 2000 数据库自动备份设置方法sql语句练习实例之二——找出销售冠军sql server里书签查找的性能伤害sqlserver case函数应用介绍sql查询语句精华使用简要pl/sql developer 使用的一些技巧目前用到的两个分页存储过程代码
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved