通过几个实验探索一下mysql for update锁的类型
表结构
CREATE TABLE `test_user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `login_name` varchar(20) NOT NULL DEFAULT '', `name` varchar(30) NOT NULL DEFAULT '', PRIMARY KEY (`id`), UNIQUE KEY `idx_login_name` (`login_name`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4
记录
引用
insert into `test_user` (`id`, `login_name`, `name`) values('1','zhangsan','张三');
insert into `test_user` (`id`, `login_name`, `name`) values('2','lisi','李四');
insert into `test_user` (`id`, `login_name`, `name`) values('2','lisi','李四');
实验1
session_1
begin; select * from test_user where login_name = 'zhangsan' for update; +----+------------+--------+ | id | login_name | name | +----+------------+--------+ | 1 | zhangsan | 张三 | +----+------------+--------+
session_2
begin; select * from test_user where login_name = 'zhangsan' for update; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
实验2
session_1
begin; select * from test_user where login_name = 'zhangsan' for update; +----+------------+--------+ | id | login_name | name | +----+------------+--------+ | 1 | zhangsan | 张三 | +----+------------+--------+ 1 row in set (0.00 sec)
session_2
select * from test_user where login_name = 'lisi' for update; +----+------------+--------+ | id | login_name | name | +----+------------+--------+ | 2 | lisi | 李四 | +----+------------+--------+ 1 row in set (0.00 sec)
从实验1和实验2可以看出,对于有唯一索引的列,select for update 加的是排他锁,行级锁。锁定后,可以对其他行进行for update的查询
实验3
session_1
begin; select * from test_user where login_name = 'bucunzai' for update; Empty set (0.00 sec)
session_2
begin; select * from test_user where login_name = 'bu4' for update; Empty set (0.00 sec) insert into test_user (login_name,name) values ('bu4','bu2name'); 阻塞等待
session_1
commit; 提交
session_2
Query OK, 1 row affected (20.62 sec) 执行成功
实验4
session_1
begin; select * from test_user where login_name = 'bucunzai' for update; Empty set (0.00 sec)
session_2
select * from test_user where login_name = 'zhangsan' for update; +----+------------+--------+ | id | login_name | name | +----+------------+--------+ | 1 | zhangsan | 张三 | +----+------------+--------+ 1 row in set (0.00 sec) update test_user set name = '张三丰' where login_name = 'zhangsan'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
从实验3和实验4可以看出,for update 语句对于空记录加共享锁,此时其他线程不能插入,可以进行查询操作。 对于已有记录没有加锁,其他线程可以对记录进行修改。
相关推荐
总的来说,"MySQL for Python"这本书将带你探索Python与MySQL的完美结合,提供详尽的指导和实例,帮助你成为一名熟练的数据库开发者。无论你是初学者还是有经验的程序员,都能从中获得宝贵的见解和技巧,提升你在...
《Clojure for MySQL:连接与操作数据库的艺术》 在当今的软件开发中,数据库管理扮演着至关重要的角色,而MySQL作为世界上最受欢迎的关系型数据库管理系统之一,其高效、稳定和开源的特性深受开发者喜爱。Clojure...
- **Navicat for MySQL**:提供了一种更为直观的方式来管理 MySQL 数据库。 通过以上介绍,我们可以了解到 MySQL 快速入门所需要掌握的基本知识点。这些知识点覆盖了 MySQL 的安装、基本操作以及一些常用的数据定义...
1. 使用包管理器(如apt-get for Ubuntu/Debian或yum for CentOS/RHEL)安装MySQL。 2. 输入`sudo apt-get install mysql-server`或`sudo yum install mysql-server`。 3. 配置过程中会提示设置root用户的密码。 4. ...
- MySQL中的常用SQL命令:CREATE DATABASE创建数据库,USE选择数据库,CREATE TABLE创建表,INSERT INTO插入数据,SELECT查询数据,UPDATE更新数据,DELETE删除数据。 3. **PHP与MySQL的结合**: - PHP通过MySQLi...
1. PHP基础:变量、数据类型、控制结构(if-else、switch、for、while)、函数、数组、字符串操作等基本概念。 2. 面向对象编程:类的定义、对象的实例化、继承、多态、封装。 3. 错误和异常处理:了解如何有效地...
MySQL是一种广泛使用的开源关系型数据库管理系统,以其高效、稳定和易于管理的特点,被众多企业和开发者所青睐。在本文中,我们将深入探讨MySQL的安装过程以及使用手册...不断实践和探索,才能更好地掌握MySQL的精髓。
### InnoDB 的奥秘:深入探索 MySQL 的 InnoDB 存储引擎特性 #### 一、InnoDB 存储引擎概述 InnoDB 存储引擎是一种专门为事务处理、高可靠性和性能优化设计的存储引擎,自 MySQL 5.5 版本起成为 MySQL 的默认存储...
在MySQL中,可以创建自定义类型以增强数据的表达能力。虽然例子中只提到创建自定义类型`dollars`,但未给出具体的SQL语句。通常创建自定义类型(如枚举或用户定义的数据类型)的语法如下: ```sql CREATE TYPE ...
`mysql-8.0.21-winx64.zip`是MySQL 8.0.21 for Windows的压缩包,它包含了MySQL服务器的所有必要组件。解压后,你需要按照以下步骤进行安装: 1. 打开解压后的文件夹,找到“setup.exe”并双击运行。 2. 在安装向导...
《PHP_MySQL教程》是针对初学者设计的一套完整的教学资源,旨在帮助你快速掌握PHP与MySQL这两种在Web开发中不可或缺的...在实践中不断探索和尝试,你的PHP和MySQL技能将得到显著提升,为你的Web开发事业打下坚实基础。
如果你正在探索更高级的主题,如存储过程、触发器或视图,那么Python的MySQL接口同样能支持这些功能。在实际项目中,结合Python的灵活性和MySQL的强大数据库能力,你将能够实现复杂的数据管理需求。
### MySQL进阶之Query优化分析 #### 一、MySQL性能影响因素 MySQL作为一种广泛使用的数据库管理系统,在实际的应用场景中,其...以上内容仅为MySQL性能优化的基础部分,深入学习还需要结合实际项目不断实践和探索。
SQL语言是与MySQL交互的主要工具,包括数据查询(SELECT)、插入(INSERT)、更新(UPDATE)、删除(DELETE)等基本操作,以及更复杂的联接(JOIN)、子查询和聚合函数。了解视图、存储过程和触发器等高级特性可以...
- 锁机制:理解行级锁和表级锁的概念,以及在并发环境下如何使用它们。 - 数据缓存:探索如何使用PHP的缓存技术,如memcached或APC,提高网站性能。 4. Web应用框架: - Laravel或Symfony:了解这些流行的PHP...
1. **安装MySQL**:在Linux系统中,通常使用包管理器(如`apt` for Ubuntu/Debian或`yum` for CentOS/RHEL)来安装MySQL服务器。命令行中执行`sudo apt install mysql-server`或`sudo yum install mysql-server`,...
MySQL 5.0是数据库管理系统中的一个重要版本,它提供了丰富的功能和优化的性能。了解其常用命令对于管理和操作数据库至关重要。以下是一些关键的MySQL 5.0...在实践中,不断探索和积累经验,才能真正成为MySQL的大师。
理解SQL语言是至关重要的,它包括SELECT语句用于查询数据,INSERT语句用于添加新记录,UPDATE用于修改已有记录,以及DELETE语句用于删除记录。此外,还将学习到事务处理、索引优化和数据库安全策略。 PHP与MySQL的...
2. **SQL语句**:MySQL使用SQL(Structured Query Language)进行数据操作,包括SELECT(查询)、INSERT(插入)、UPDATE(更新)和DELETE(删除)等。 3. **查询数据**:`mysqli_query()`执行SQL查询,例如`$...
UPDATE mysql.user SET Password='' WHERE User='root'; FLUSH PRIVILEGES; QUIT; ``` 这会将root用户的密码置为空。但是,为了安全起见,你应该立即设置一个新的密码。为此,退出并重新启动MySQL服务,然后使用`...