zoukankan      html  css  js  c++  java
  • Mysql 表锁行锁

     

    表锁

     

     

    表读锁 

    SET AUTOCOMMIT=0;  //设置事物不自动提交
    lock table test read ;

    当前进程的是可以读取到的,其他进程也可以读取到,

    当前进程读取其他表就会提示被锁,无法读取,而且当前进程也是没有办法写入的

    其他进行写的时候会进行等待中,(必须等所有的表锁都释放了才可以)

     

    1099 - Table 'test' was locked with a READ lock and can't be updated, Time: 0.002000s

     

    COMMIT;
    UNLOCK TABLES;

    unlock tables; 释放当前进程的所有表锁

     

    show open tables where in_use > 0;

    查看多少个进程对表进行了加锁

     

     

    表写锁

     

    SET AUTOCOMMIT=0;  //设置事物不自动提交
    lock table test write,pms write ;

     

    当前进程 可以读和写 被锁的表,  访问其他表就不可以

     

    其他进程 读取和写入被锁的表 将进入等待中

     

     

     

     

     

    总结:表锁,读锁会阻塞写,不会阻塞读。而写锁则会把读写都阻塞

     

     

     

    select * from innodb_trx;查看有是哪些事务占据了表资源

     

    trx_id:事务ID。
    trx_state:事务状态,有以下几种状态:RUNNING、LOCK WAIT、ROLLING BACK 和 COMMITTING。
    trx_started:事务开始时间。
    trx_requested_lock_id:事务当前正在等待锁的标识,可以和 INNODB_LOCKS 表 JOIN 以得到更多详细信息。
    trx_wait_started:事务开始等待的时间。
    trx_weight:事务的权重。
    trx_mysql_thread_id:事务线程 ID,可以和 PROCESSLIST 表 JOIN。
    trx_query:事务正在执行的 SQL 语句。
    trx_operation_state:事务当前操作状态。
    trx_tables_in_use:当前事务执行的 SQL 中使用的表的个数。
    trx_tables_locked:当前执行 SQL 的行锁数量。
    trx_lock_structs:事务保留的锁数量。
    trx_lock_memory_bytes:事务锁住的内存大小,单位为 BYTES。
    trx_rows_locked:事务锁住的记录数。包含标记为 DELETED,并且已经保存到磁盘但对事务不可见的行。
    trx_rows_modified:事务更改的行数。
    trx_concurrency_tickets:事务并发票数。
    trx_isolation_level:当前事务的隔离级别。
    trx_unique_checks:是否打开唯一性检查的标识。
    trx_foreign_key_checks:是否打开外键检查的标识。
    trx_last_foreign_key_error:最后一次的外键错误信息。
    trx_adaptive_hash_latched:自适应散列索引是否被当前事务锁住的标识。
    trx_adaptive_hash_timeout:是否立刻放弃为自适应散列索引搜索 LATCH 的标识。

     

    下面对 innodb_locks 表的每个字段进行解释:

    lock_id:锁 ID。
    lock_trx_id:拥有锁的事务 ID。可以和 INNODB_TRX 表 JOIN 得到事务的详细信息。
    lock_mode:锁的模式。有如下锁类型:行级锁包括:S、X、IS、IX,分别代表:共享锁、排它锁、意向共享锁、意向排它锁。表级锁包括:S_GAP、X_GAP、IS_GAP、IX_GAP 和 AUTO_INC,分别代表共享间隙锁、排它间隙锁、意向共享间隙锁、意向排它间隙锁和自动递增锁。
    lock_type:锁的类型。RECORD 代表行级锁,TABLE 代表表级锁。
    lock_table:被锁定的或者包含锁定记录的表的名称。
    lock_index:当 LOCK_TYPE=’RECORD’ 时,表示索引的名称;否则为 NULL。
    lock_space:当 LOCK_TYPE=’RECORD’ 时,表示锁定行的表空间 ID;否则为 NULL。
    lock_page:当 LOCK_TYPE=’RECORD’ 时,表示锁定行的页号;否则为 NULL。
    lock_rec:当 LOCK_TYPE=’RECORD’ 时,表示一堆页面中锁定行的数量,亦即被锁定的记录号;否则为 NULL。
    lock_data:当 LOCK_TYPE=’RECORD’ 时,表示锁定行的主键;否则为NULL。

    下面对 innodb_lock_waits 表的每个字段进行解释:

    requesting_trx_id:请求事务的 ID。
    requested_lock_id:事务所等待的锁定的 ID。可以和 INNODB_LOCKS 表 JOIN。
    blocking_trx_id:阻塞事务的 ID。
    blocking_lock_id:某一事务的锁的 ID,该事务阻塞了另一事务的运行。可以和 INNODB_LOCKS 表 JOIN。

     

     

     

    行锁

     

     

    分为排它锁和共享锁 

     

    排它锁

     

    set autocommit=0;
    SELECT * from members where id=1 or id=2 for UPDATE

     

    这样id为 1 和2 的列就被锁住了,如果再有其他进程执行这段sql的之后就会进行等待

     

    释放当前的行锁  

    COMMIT

     

    获取锁超时

    [40001][1205] Lock wait timeout exceeded; try restarting transaction

     

    但是这个时候你再去锁其他列是不受影响的,读取的时候 不加for update(争抢锁) 都是不会出现等待的

    但是修改这列的时候就会出现等待了

     

     

    共享锁

    就是锁写不锁读

    set autocommit=0;
    SELECT * from members where id=3 lock in share mode;

    你在修改这个列的时候当前事物内正常执行,但是其他进程进行写的时候就会进行等待

    update members set username ='123' where id=3

    同样也是commit 去释放锁

    COMMIT

     

    锁状态分析

     show status like 'innodb_row_lock%';

    innodb_row_lock_current_waits: 当前正在等待锁定的数量

    innodb_row_lock_time: 从系统启动到现在锁定总时间长度;非常重要的参数,

    innodb_row_lock_time_avg: 每次等待所花平均时间;非常重要的参数,

    innodb_row_lock_time_max: 从系统启动到现在等待最常的一次所花的时间;

    innodb_row_lock_waits: 系统启动后到现在总共等待的次数;非常重要的参数。直接决定优化的方向和策略。

     

     

  • 相关阅读:
    浅谈Charles —— 青花瓷
    jdbc
    装饰者模式
    java可变参数
    简单日历
    DVD管理系统
    图片拷贝
    时间输出
    java基础小知识
    jQuery HTML
  • 原文地址:https://www.cnblogs.com/wlphp/p/12904313.html
Copyright © 2011-2022 走看看