数据库锁
锁和索引是数据库两大核心概念 , 了解索引 , 可以从 B+ 树 , Hash 索引 , 页结构 , 缓存池 , 索引原则等方面理解 。理解锁 , 要从哪些方面入手?
为什么要加锁加锁的目的 , 其实是为了保证数据的一致性 。当多个线程并发访问某个数据时 , 加锁 , 可以保证这个数据在任何时刻最多只有一个线程在访问 , 保证数据的完整性和一致性 。
锁的分类锁可以按照锁粒度划分 , 可以按照数据库管理角度划分 。
按照锁粒度划分按照锁粒度划分 , 可以将锁划分成 行锁 , 页锁和表锁 。
快速回忆一遍 InnoDB 存储引擎的逻辑结构:所有数据都被逻辑地存放在一个空间内 , 称为表空间 , 而表空间由段(sengment)、区(extent)、页(page)组成 。
文章插图
InnoDB存储引擎的逻辑结构
- 行锁
- 页锁
- 表锁
【数据库锁分类】InnoDB 和 Oracle 支持行锁和表锁 , MyISAM 只支持表锁 , MySQL BDB 存储引擎支持页锁和表锁 。SQL Server 可以支持行锁 , 页锁和表锁 。
文章插图
image
按照数据库管理角度划分按照数据库管理角度划分 , 可以将锁分成排他锁和共享锁 。
- 共享锁
给某个表加共享锁:
LOCK TABLE product_comment READ;
当数据表加上共享锁的时候 , 该表数据就会变成只读模式 , 当时我们想更新 product_comment 表中的数据会报错 , 比如:UPDATE product_comment SET product_id = 10002 WHERE user_id = 912178;
系统报错如下:ERROR 1099 (HY000): Table 'product_comment' was locked with a READ lock and can't be updated
如果对表共享锁进行解锁:UNLOCK TABLE;
给某行数据加共享锁SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE
例子:SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE user_id = 912178 LOCK IN SHARE MODE
- 排他锁
给表加排他锁
LOCK TABLE product_comment WRITE;
排他锁的事务可以对 product_comment 进行查询和修改 。其他事务如果想要在 product_comment 表上查询数据 , 则需要等待 。释放掉排他锁
UNLOCK TABLE;
数据行上添加排他锁SELECT * FROM table_name WHERE ... FOR UPDATE
例子:SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE user_id = 912178 FOR UPDATE;
当我们对数据进行更新的时候会自动使用排他锁 , 也就是 INSERT , DELETE 或者 UPDATE 的时候 , 数据库自动使用排他锁 , 防止其他事务对改数据进行操作 。从程序员角度进行划分
- 乐观锁
推荐阅读
- 茶艺的三种社会形态,茶艺根据不同的原则和方法的分类
- 茶叶茶水分开,罐装茶水分类
- 茶树品种有哪些分类,具体有哪些种类
- 淘宝评价中评改好评在哪里改 淘宝店分类修改
- 茶艺表演的分类介绍,山东农大举办碧霞春杯研茶致学茶艺技能大赛
- 茶道的基本观念,茶道的分类是什么分的
- 篮球场尺寸分类及修建
- 淘宝店铺怎么修改宝贝分类 怎么删除淘宝店铺的所有分类
- 茶叶的分类先容,茉莉花茶的基本先容
- MYSQL 由一个锁问题,带出MYSQL事务错误不回滚的问题