赞
踩
数据库锁定机制简单来说,就是数据库为了保证数据库的一致性,而使用各种共享资源而在被并发访问变得有序所设计的一种规则
假设当前商品只有一件, 两个用户同时购买,我们需要保证只有一个用户能下单成功.
因为购买行为是一组操作,这里需要使用事务控制,从获取商品数量,插入订单 到付款后插入付款信息,更新商品数量.在这个过程中,使用锁可以对有限的资源进行保护
Mysql数据库由于其自身架构的特点,存在多种数据存储引擎,Mysql中不同的存储引擎支持不同的锁机制
按照数据操作的类型分:
按照操作性能可以分为乐观锁和悲观锁:
-- 创建数据库 CREATE DATABASE test_lock CHARACTER SET 'utf8'; -- 创建表,选择 MYISAM存储引擎 CREATE TABLE mylock01( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(20) )ENGINE MYISAM; -- 创建表 CREATE TABLE mylock02( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(20) )ENGINE MYISAM; -- mylock01表中向插入数据 INSERT INTO mylock01(title) VALUES('a1'); INSERT INTO mylock01(title) VALUES('b1'); INSERT INTO mylock01(title) VALUES('c1'); INSERT INTO mylock01(title) VALUES('d1'); INSERT INTO mylock01(title) VALUES('e1'); -- mylock02表中向插入数据 INSERT INTO mylock02(title) VALUES('a'); INSERT INTO mylock02(title) VALUES('b'); INSERT INTO mylock02(title) VALUES('c'); INSERT INTO mylock02(title) VALUES('d'); INSERT INTO mylock02(title) VALUES('e'); SELECT * FROM mylock01;
查看表中加过的锁:
-- 0表示没有加锁,当前的所有数据库表都没有加锁
SHOW OPEN TABLES;
-- 查询加锁的表,条件In_use 大于0
SHOW OPEN TABLES WHERE In_use > 0;
-- 语法格式: LOCK TABLE 表名 READ(WRITE), 表名2 READ(WRITE), 其他;
-- 为mylock01加读锁(共享锁) , 给mylock02加写锁(排他锁)
lock table mylock01 read,mylock02 write;
SHOW OPEN TABLES WHERE In_use > 0;
-- 方式1
unlock tables;
-- 方式2 找到锁进程,得到id
SHOW PROCESSLIST;
kill id
行锁的是mysql锁中粒度最小的一种锁,因为锁的粒度很小,所以发生资源争抢的概率也最小,并发性能最大,但是也会造成死锁,每次加锁和释放锁的开销也会变大。
共享锁只能兼容共享锁, 不兼容排它锁
排它锁互斥共享锁和其它排它锁
行级锁都是基于索引的,如果一条 SQL 语句用不到索引是不会使用行级锁的,而会使用表级锁把整张表锁住
总结: 行级锁中的写锁主要是为了解决在修改数据时,不允许其他事务对当前数据进行修改和读取操作,从而可以有效避免”脏读”问题的产生。
总结:在有写锁情况下,其他事物不能再对当前数据添加写锁,从而保证数据的一致性,从而避免了不可从重复读的问题
for update 是在数据库中上锁用的,可以为数据库中的行上一个排他锁。
存在高并发并且对于数据的准确性很有要求的场景,是需要了解和使用for update的。
for update 仅适用于InnoDB,并且必须开启事务,在begin与commit之间才生效。
-- 排他锁查询
select * from innodb_lock where id = 1 for update;
-- 共享锁查询
select * from innodb_lock where id = 1 lock in share mode;
mysql> SHOW STATUS LIKE 'innodb_row_lock%';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 51265 |
| Innodb_row_lock_time_avg | 51265 |
| Innodb_row_lock_time_max | 51265 |
| Innodb_row_lock_waits | 1 |
+-------------------------------+-------+
Innodb_row_lock_current_waits:当前正在等待锁定的数量。
Innodb_row_lock_time:从系统启动到现在锁定总时间长度(重要)。
Innodb_row_lock_time_avg:每次等待所花的平均时间(重要)。
Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花的时间。
Innodb_row_lock_waits:系统启动后到现在总共等待的次数(重要)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。