其他分享
首页 > 其他分享> > 锁

作者:互联网

十五、锁

在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源,当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。

1 锁分类

1.1 按操作类型分

1.2 按操作粒度分

开销 加锁速度 可能出现死锁 并发程度
表锁
页锁 中等 中等 中等
行锁

存储引擎使用什么类型的锁:

2 锁的使用

查看当前数据库中表的上锁情况:

show open tables;  
# 0 表示未上锁

2.1 表锁

表锁一般是MyISAM引擎使用。

添加表锁

lock table 表名1 read(write), 表名2 read(write), ...;

释放所有表锁

unlock tables;

会话session1将表A加读锁之后:

会话session1将表A加写锁之后:

结论:

其他分析工具:

可以通过检查table_locks_waitedtable_locks_immediate状态变量来分析系统上的表锁定:

show status like 'table%';
+----------------------------+--------+
| Variable_name              | Value  |
+----------------------------+--------+
| Table_locks_immediate      | 500440 |
| Table_locks_waited         | 1      |
| Table_open_cache_hits      | 500070 |
| Table_open_cache_misses    | 5      |
| Table_open_cache_overflows | 0      |
+----------------------------+--------+
5 rows in set (0.00 sec)

2.2 行锁

行锁一般是InnoDB引擎使用。

InnoDB基于索引来自动加行锁:对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁;对于普通SELECT语句,InnoDB不会加任何锁。

但是,行锁可能因为未使用索引而升级为表锁,所以除了检查索引是否创建的同时,也需要通过explain查询索引是否被实际使用。行锁相对于表锁来说,优势在于高并发场景下表现更突出,毕竟锁的粒度小。

3 乐观锁和悲观锁

数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。实现方式:使用数据库中的锁机制

乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过version的方式来进行锁定。实现方式:乐一般会使用版本号机制或CAS算法实现。

两种锁的使用场景

从上面对两种锁的介绍,我们知道两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。

但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。

标签:,加锁,session1,并发,锁定,表锁,表级
来源: https://www.cnblogs.com/yyyzyyyz/p/15856252.html