`

mysql中select * for update

阅读更多

转自:http://www.cnblogs.com/liangge0218/archive/2011/08/24/2151630.html

 

由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住)。
举个例子:
假设有个表单products ,里面有id跟name二个栏位,id是主键。
例1: (明确指定主键,并且有此笔资料,row lock)
SELECT * FROM products WHERE id='3' FOR UPDATE;
SELECT * FROM products WHERE id='3' and type=1 FOR UPDATE;

例2: (明确指定主键,若查无此笔资料,无lock)
SELECT * FROM products WHERE id='-1' FOR UPDATE;

例2: (无主键,table lock)
SELECT * FROM products WHERE name='Mouse' FOR UPDATE;

例3: (主键不明确,table lock)
SELECT * FROM products WHERE id<>'3' FOR UPDATE;

例4: (主键不明确,table lock)
SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;

注1: FOR UPDATE仅适用于InnoDB,且必须在交易区块(BEGIN/COMMIT)中才能生效。
注2: 要测试锁定的状况,可以利用MySQL的Command Mode ,开二个视窗来做测试。

在MySql 5.0中测试确实是这样的
另外:MyAsim 只支持表级锁,InnerDB支持行级锁
添加了(行级锁/表级锁)锁的数据不能被其它事务再锁定,也不被其它事务修改(修改、删除)
是表级锁时,不管是否查询到记录,都会锁定表

此外,如果A与B都对表id进行查询但查询不到记录,则A与B在查询上不会进行row锁,但A与B都会获取排它锁,此时A再插入一条记录的话则会因为B已经有锁而处于等待中,此时B再插入一条同样的数据则会抛出Deadlock found when trying to get lock; try restarting transaction然后释放锁,此时A就获得了锁而插入成功

分享到:
评论

相关推荐

    MySQL锁类型以及子查询锁表问题、解锁1

    SELECT * FROM products WHERE id='3' FOR UPDATE; ``` 如果查询条件未指定主键或者无法唯一确定一行,如使用`&lt;&gt;`或`LIKE`操作符,MySQL可能会退化为表级锁,锁定整个表。例如: ```sql SELECT * FROM products ...

    根据update语句自动生成select语句

    在数据库管理中,UPDATE语句用于修改已存在的数据记录,而SELECT语句则用于查询数据。在某些场景下,我们可能需要从UPDATE语句转换为SELECT语句,以验证更新操作将影响哪些行或者理解更新逻辑。这在调试、数据分析或...

    Mysql 数据库死锁过程分析(select for update)

    避免这种死锁的一种方法是在设计事务时遵循一定的顺序规则,例如,确保所有事务按照相同的顺序访问和修改数据,或者使用`FOR UPDATE SKIP LOCKED`(Oracle支持,但MySQL不直接支持)来跳过已锁定的行。另外,可以...

    mysql SELECT FOR UPDATE语句使用示例

    MySQL中的`SELECT FOR UPDATE`语句是在事务处理中用于实现数据锁定的一种机制,它主要用于解决多用户并发操作时的数据一致性问题。在InnoDB存储引擎下,MySQL默认的事务隔离级别是`REPEATABLE READ`,这允许事务在...

    mysql事务select for update及数据的一致性处理讲解

    MySQL中的事务,默认是自动提交的,即autocommit = 1; 但是这样的话,在某些情形中就会出现问题:比如: 如果你想一次性插入了1000条数据,mysql会commit1000次的, 如果我们把autocommit关闭掉[autocommit = 0],...

    MySQL数据库中group by语句与update语句的用法研究.pdf

    MySQL 数据库中 group by 语句与 update 语句的用法研究 本论文对 MySQL 数据库中的 group by 语句和 update 语句进行了深入研究,讨论了这些语句在数据库查询和修改中的应用,并给出了具体的解决方案。 一、MySQL...

    update mysql with c++

    在“update mysql with c++”这个主题中,我们将学习以下关键知识点: 1. **连接MySQL数据库**:使用`MYSQL*`结构体创建一个数据库连接,并通过`mysql_init()`初始化。然后,用`mysql_real_connect()`函数连接到...

    MySQL中SELECT+UPDATE处理并发更新问题解决方案分享

    在MySQL数据库环境中,处理并发更新问题是一个常见的挑战,特别是在高流量的应用中。本文将深入探讨如何使用`SELECT+UPDATE`策略解决这个问题,并分享两种具体的解决方案。 首先,让我们回顾一下问题的背景。假设...

    mysql基础操作

    - 为了能够在命令行中直接运行MySQL的相关命令,需要将MySQL的bin目录添加到系统环境变量Path中。 - 修改方法:在系统环境变量中找到Path,将`%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;`这...

    mysql 5.0 for windows

    - **UPDATE**:更新数据。 - **DELETE FROM**:删除数据。 - **ALTER TABLE**:修改表结构。 - **JOIN**:联接多个表进行复杂查询。 - **GROUP BY**和**HAVING**:用于分组和过滤数据。 **6. 性能调优** MySQL 5.0...

    mysql数据库精华.doc

    - `SELECT TOP 10 * FROM 数据表 WHERE 字段名 = 字段值 ORDER BY 字段名 [DESC]`:这是SQL Server的语法,但在MySQL中,你可以使用`LIMIT 10`来获取前10条匹配的记录。 - `SELECT * FROM 数据表 WHERE 字段名 IN...

    mysql语法文档

    mysql语法文档 ... * my_ulonglong mysql_affected_rows(MYSQL *mysql):返回最后一个update、delete、insert操作影响的记录数 * my_ulonglong mysql_num_rows(MYSQL_RES *res):返回查询结果的行数

    mysql基础命令(Mysql常用命令、Mysql中数据库操作、SQL命令的使用)

    - **UPDATE**:用于更新现有记录,如`UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition;` - **DELETE FROM**:用于删除记录,如`DELETE FROM table_name WHERE condition;` - **CREATE ...

    mysql 安装 用法 下载

    在本篇文章中,我们将深入探讨MySQL的安装、基本用法以及下载过程。 **一、MySQL的安装** 1. **Windows系统安装** - 访问MySQL官方网站(https://www.mysql.com/)下载适合您系统的安装包。 - 运行下载的.msi...

    MySQL基本知识点思维导图

    以上内容涵盖了MySQL基本知识点思维导图中的主要部分,从基础知识到核心查询再到高级应用,为学习者提供了全面深入的理解框架。通过这些知识点的学习,可以有效地掌握MySQL的核心功能,并能够灵活运用到实际项目中去...

    详解 Mysql中的delimiter定义及作用

    初学mysql时,可能不太明白delimiter的真正用途,delimiter在mysql很多地方出现,比如...mysql&gt; select * from test_table; 然后回车,那么MySQL将立即执行该语句。 但有时候,不希望MySQL这么做。在为可能输入较多的语

Global site tag (gtag.js) - Google Analytics