`
ansn001
  • 浏览: 94838 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

mysql锁机制

阅读更多

转自:http://thebye85.iteye.com/blog/1463546,仅借学习

MySQL有三种锁的级别:页级、表级、行级。
MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-levellocking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。以下讲的都是在innodb引擎的前提下。

 

1、共享锁(Share Locks,即S锁),使用方式select ... LOCK IN SHARE MODE
SELECT ... LOCK IN SHARE MODE sets a shared mode lock on the rows read. A shared mode lock enables other sessions to read the rows but not to modify them. The rows read are the latest available, so if they belong to another transaction that has not yet committed, the read blocks until that transaction ends.
如:事务A中有select ... lock in share mode未提交前,其它事务的可以读本次事务前的最新值,写操作会阻塞直到事务A提交后才执行。

 

例子:

Sql代码  收藏代码
  1. SELECT * FROM parent WHERE NAME = 'Jones' LOCK IN SHARE MODE;  

A read performed with LOCK IN SHARE MODE reads the latest available data and sets a shared mode lock on the rows read. 
A shared mode lock prevents others from updating or deleting the row read. 
Also, if the latest data belongs to a yet uncommitted transaction of another session, we wait until that transaction ends. 
After we see that the LOCK IN SHARE MODE query returns the parent 'Jones', we can safely add the child record to the child table and commit our transaction.
执行select ... LOCK IN SHARE MODE能读取最新的数据,select结果的全部行都会加行锁(如果这些行已被其它事务先加锁,如for update,则等待锁释放后再加锁),其它事务不能select .... for update、update和delete操作这些行记录,直到锁释放。select ... FOR UPDATE同时只能有一个在语句执行,另一个会阻塞;select ... LOCK IN SHARE MODE可以多个同时执行(这也是和for update最大的区别)

 

2、排它锁(Exclusive Locks,即X锁),使用方式:select ... FOR UPDATE 
For index records the search encounters, SELECT ... FOR UPDATE blocks other sessions from doing SELECT ... LOCK IN SHARE MODE or from reading in certain transaction isolation levels. Consistent reads will ignore any locks set on the records that exist in the read view. (Old versions of a record cannot be locked; they will be reconstructed by applying undo logs on an in-memory copy of the record.)
如:事务A中有select ... for update未提交前,则其它事务的读、写操作会阻塞到事务A提交后才执行。

例子1: 
如一个事务中有select ... for update且事务还未提交,其它事务执行select ... for update会等待锁释放,执行select ... lock in share mode会等待锁释放,执行update或delete会等待锁释放,但可以执行普通select ...语句,因为普通的select查询的是数据快照。

 

    console1:

Sql代码  收藏代码
  1. mysql> start transaction;  
  2. mysql> select * from test where id = 1 for update;  

 

    console2:

Sql代码  收藏代码
  1. mysql> start transaction;  
  2. mysql> select * from test where id = 1; -- 查询的是快照数据  
  3. +----+------------+-------+---------------------+---------------------+  
  4. | id   | code        | valid | gmt_create        | gmt_modified     |  
  5. +----+------------+-------+---------------------+---------------------+  
  6. |  1   | 8967747 |     1  | 2011-11-16 16:44:52 | 2011-12-15 19:16:36 |  
  7. +----+------------+-------+---------------------+---------------------+  
  8. mysql> update test set valid = 0 where id = 1;  
  9. 1205 - Lock wait timeout exceeded; try restarting transaction  

select ... for update锁住的行记录,其它事务不可修改,如果有修改会wait直到锁释放(事务commit)或超时

 

例子2:

利用select ... for update来实现更新原子性(排它锁)

思路是先锁住行记录(select ... for update),再更新。

 

Sql代码  收藏代码
  1. mysql> start transaction;  
  2. mysql> select * from region   
  3.             where id = 1  
  4.             and status = 1   
  5.             and remain_prize_quantity > 0  
  6.             for update;  
  7. mysql> update region  
  8.             set remain_prize_quantity = remain_prize_quantity - 1,  
  9.             gmt_modified = now()  
  10.             where id = 1  
  11.             and status = 1   
  12.             and remain_prize_quantity > 0;  
  13. mysql> commit;  
  

参考:

http://dev.mysql.com/doc/refman/5.1/en/innodb-locking-reads.html

http://dev.mysql.com/doc/refman/5.1/en/innodb-lock-modes.html

http://dev.mysql.com/doc/refman/5.1/en/innodb-locks-set.html

分享到:
评论

相关推荐

    MYSQL锁机制

    ### MySQL锁机制详解 #### 一、MySQL锁机制概述 MySQL中的锁机制是数据库管理系统用于控制并发事务对数据资源访问的关键技术之一。合理地管理和利用锁机制能够有效地防止数据不一致性和提高系统的并发处理能力。...

    MYSQL锁机制全揭秘

    MySQL锁机制是数据库管理系统中用于协调多个事务或者进程,以保证数据的完整性和一致性的一套规则。在数据库操作中,保证数据并发访问时的一致性、有效性是至关重要的,锁机制正是为此而生。 MySQL支持不同存储引擎...

    mysql 锁机制及mysql中的锁介绍.pdf

    系统介绍mysql锁机制

    Mysql 锁机制的详细说明

    【MySQL 锁机制详解】 MySQL 的锁机制是数据库管理系统中用于协调多个并发事务对数据进行访问的一种机制,确保数据的一致性和完整性。在开发中,虽然我们可能并不总是主动使用锁,但它们在多用户环境下确保数据正确...

    MySQL锁机制_管理 .mht

    MySQL锁机制_管理(并发锁,行锁,表锁,预加锁,全局锁等等).mht

    MySQL锁机制与用法分析

    本文实例讲述了MySQL锁机制与用法。分享给大家供大家参考,具体如下: MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁;BDB存储引擎采用的是...

    59 对MySQL锁机制再深入一步,共享锁和独占锁到底是什么?l.pdf

    在深入探讨MySQL数据库的锁机制之前,我们首先需要了解锁的基本概念。在数据库系统中,锁是一种用来保障并发控制的机制,它用来协调不同事务对同一个数据对象的访问。锁的目的是为了防止多个事务并发操作时造成的...

    行业-59 对MySQL锁机制再深入一步,共享锁和独占锁到底是什么?l.rar

    MySQL数据库在多用户环境下为了保证数据的一致性和完整性,引入了锁机制。锁是数据库管理系统中用于控制并发操作的一种机制,它确保了多个事务在读写数据时不会产生冲突。本篇文章将深入探讨MySQL中的两种主要锁类型...

    Mysql 锁机制笔记1

    MySQL的锁机制是数据库管理系统中用于确保数据一致性的重要工具,尤其是在高并发的读写操作中。MySQL支持三种级别的锁:行级锁、页级锁和表级锁。其中,MyISAM存储引擎使用的是表级锁,而InnoDB则采用行级锁和表级锁...

    MySQL:锁机制.pdf

    本知识点详细解读了MySQL锁机制的定义、分类、特点以及具体的应用案例。 1. 锁的定义和分类 在数据库系统中,锁是用来控制多个用户或进程对同一数据资源进行访问的同步机制。它解决的是多个操作同时对同一资源进行...

    MYSQL锁机制全揭秘.pdf

    现在开发中越来越多会接触到各种锁,这里分享mysql的锁机制,在开发中随着用户量增大并发量也随之增大,资源争用成为了开发者关注的焦点,锁的实现也必不可少。所以我们不得不深入了解锁的原理及机制,来优化我们的...

    MySQL8.0锁机制和事务

    MySQL 8.0 锁机制和事务 MySQL 8.0 中的锁机制和事务是数据库系统中非常重要的概念。锁机制是指数据库系统中对数据访问的控制机制,而事务是指数据库系统中的一组操作单元。了解锁机制和事务是非常关键的,因为它们...

    MySQL锁的详细介绍

    MySQL锁机制是 MySQL 中的一个重要概念,它决定了数据库中数据的读写权限和并发控制。本文将对 MySQL 锁机制进行详细的介绍,包括锁分类、锁类型、锁机制、行锁原理等内容。 一、锁分类 MySQL 锁可以从多个角度...

    MySQL高级 锁机制

    MySQL的锁机制是数据库管理系统中用于控制并发操作的重要机制,对于多用户环境下的数据一致性、事务隔离性和系统性能有着至关重要的影响。本文将深入探讨MySQL的高级锁机制,包括表锁和行锁,并提供一些优化建议。 ...

    MySQL的锁机制解析

    MySQL的锁机制是数据库管理系统中用于控制并发操作的重要机制,对于保证数据的一致性和完整性起着至关重要的作用。本文将深入解析MySQL中的锁机制,帮助读者理解其工作原理,为面试准备或日常数据库管理提供有力支持...

    mysql锁分析(csdn)————程序.pdf

    MySQL 锁机制是 MySQL 数据库中用于管理并发访问的机制, MySQL 锁机制主要有三种类型:表锁、行锁、页锁。每种锁机制都有其特点和应用场景。 表锁 表锁是 MySQL 中最基本的锁机制,表锁分为共享锁和排他锁。共享...

    mysql锁解决并发问题共7页.pdf.zip

    MySQL数据库在处理高并发场景时,经常会...以上只是MySQL锁机制的概述,实际应用中需要根据业务需求和事务隔离级别来选择合适的锁策略。在处理并发问题时,理解并熟练运用这些锁机制,可以有效提升系统的稳定性和性能。

Global site tag (gtag.js) - Google Analytics