热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql悲观锁行级锁_悲观锁、乐观锁、行级锁、表级锁

1.悲观锁(加的是表级锁)一方:查询语句加forupdate;另一方:查询语句加forupdate;当进行更新语句的时候,另一方不能进行更

1. 悲观锁(加的是表级锁)

一方:查询语句加 for update;另一方:查询语句加 for update;

当进行更新语句的时候,另一方不能进行更新操作

2. 乐观锁

更新语句设置版本号,在指定版本中更新数据

一方:update account set money=money-200,version=version+1 where id=1 and version=0;

另一方同时操作同一个版本号,则不能更新数据

另一方:update account set money=money+200,version=version+1 where id=1 and version=0;

当执行事务时,相当于执行了锁,来保持数据的一致性,但是锁分多种,有行锁,表锁。

行锁就是只锁定那一行,那一条记录,别的连接下的操作还可以操作这张表。

表锁就是锁定整张表,只有当前连接执行完事务,才可以解锁。

以mysql为例,有索引并且使用了该索引当条件的时候就是行锁,没有索引的时候就是表锁。innodb的行锁是在有索引的情况下,没有索引的表是锁定全表的。

建议:对于插入操作,一般加表锁,但是对于修改和删除操作,最好加行锁,这样在高并发时,不用等太久。

加锁方式:

select * from testlock where id=1 for update;

##查询加锁,查询时不允许更改,该语句在自动提交为off或事务中生效,相当于更改操作,模拟加锁。

update testlock name=name;

##列=同一个列

更新操作,插入,删除操作,在事务中均属于加锁

在调用存储过程中,就会涉及到表锁,行锁这一概念:所谓区别:有索引的时候就是行锁,没有索引的时候就是表索。

innodb 的行锁是在有索引的情况下,没有索引的表是锁定全表的.

表锁演示(无索引)

Session1:

mysql> set autocommit=0;

mysql> select * from innodb_test;

+------+-------------+

| id | name |

+------+-------------+

| 1 | woshiceshi |

| 2 | woshiceshi2 |

| 3 | woshiceshi3 |

+------+-------------+

mysql> select * from innodb_test where id = 2 for update;

+------+------------+

| id | name |

+------+------------+

| 2 | woshiceshi2 |

+------+------------+

Session2:

mysql> update innodb_test set name=‘sjis‘ where id = 1 ;

处于等待状态....

再回到session1 commit以后,session2就出来结果了(锁定了8秒,过了8秒左右才去session1提交)。

mysql> update innodb_test set name=‘sjis‘ where id = 1 ;

Query OK, 1 row affected (8.11 sec)

Rows matched: 1 Changed: 1 Warnings: 0

实验结果是:我在session1的for update 操作看似只锁定ID为2的行其实锁定了全表,以至于后面session2的对ID为1的行update 需要等待Session1锁的释放。

行锁演示(索引为ID)

Session1:

mysql> alter table innodb_test add index idx_id(id);

Query OK, 4 rows affected (0.01 sec)

Records: 4 Duplicates: 0 Warnings: 0

mysql> select * from innodb_test where id = 2 for update;

+------+------------+

| id | name |

+------+------------+

| 2 | woshiceshi2 |

+------+------------+

Session2:

mysql> update innodb_test set name=‘wohaishiceshi‘ where id = 1 ;

Query OK, 1 row affected (0.02 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from innodb_test where id = 1;

+------+---------------+

| id | name |

+------+---------------+

| 1 | wohaishiceshi |

+------+---------------+

1 row in set (0.00 sec)

实验结果:这次的锁定是锁定的行,所以没有被锁定的行(ID不为2的行)可以进行update..

原文:http://www.cnblogs.com/luzai1989/p/5838997.html



推荐阅读
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • Navicat Premium 15 安装指南及数据库连接配置
    本文详细介绍 Navicat Premium 15 的安装步骤及其对多种数据库(如 MySQL 和 Oracle)的支持,帮助用户顺利完成软件的安装与激活。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文详细介绍了如何使用Python编写爬虫程序,从豆瓣电影Top250页面抓取电影信息。文章涵盖了从基础的网页请求到处理反爬虫机制,再到多页数据抓取的全过程,并提供了完整的代码示例。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 在Ubuntu 16.04 LTS上配置Qt Creator开发环境
    本文详细介绍了如何在Ubuntu 16.04 LTS系统中安装和配置Qt Creator,涵盖了从下载到安装的全过程,并提供了常见问题的解决方案。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
  • 本文详细介绍了 MySQL 的查询处理流程,包括从客户端连接到服务器、查询缓存检查、语句解析、查询优化及执行等步骤。同时,深入探讨了 MySQL 中的乐观锁机制及其在并发控制中的应用。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 5G至4G空闲态移动TAU流程解析
    本文详细解析了用户从5G网络移动到4G网络时,在空闲态下触发的跟踪区更新(TAU)流程。通过N26接口实现无缝迁移,确保用户体验不受影响。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
author-avatar
溜溜的情歌哆瑞咪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有