MySQL锁

923 阅读2分钟

一、锁的概念

锁机制是数据库为了保证数据的一致性,在使用共享资源时并发访问变得有序所设计的一种规则。

锁的分类

  • 共享锁:多个事务对同一数据可同事加锁且互不影响,但不能修改。即共享锁不阻塞其他事务的读操作,但阻塞写操作。
  • 排他锁:又称为写锁或独占锁,当前的操作没有完成前,会阻断其他操作的读取和写入。
  • 表级锁:操作时,会锁定整个表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突概率高,并发度最低。InnoDB、MyISAM引擎支持!
  • 行级锁:操作时,会锁定当前操作行。开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。InnoDB引擎默认支持!
  • 页级锁:锁的粒度、发生冲突的概率和加锁的开销介于表锁和行锁之间,会出现死锁,并发性能一般。

按使用方式分类

  • 悲观锁:在操作数据时比较悲观,每次去拿数据的时候认为别的线程也会同时修改数据,所以每次在拿数据的时候都会上锁,这样别的线程想拿到这个数据就会阻塞直到它拿到锁。
  • 乐观锁:在操作数据时非常乐观,认为别的线程不会同时修改数据,所以不会上锁,但是在更新的时候会判断在此期间别的线程有没有更新过这个数据。

二、操作步骤

共享锁

数据可以被多个事务查询,但是不能修改

// 共享锁格式:SELECT语句 LOCK IN SHARE MODE;

// 给id为1的数据,并加入共享锁
SELECT * FROM student WHERE id=1 LOCK IN SHARE MODE;

排他锁

加锁的数据,不能被其他事务加锁查询或修改

// 排他锁格式:SELECT语句 FOR UPDATE;


// 给id为1的数据,并加入排他锁
SELECT * FROM student WHERE id=1 FOR UPDATE;

读锁与解锁

// 读锁:所有连接只能读取数据,不能修改
LOCK TABLE 表名 READ;

// 为product表加入读锁
LOCK TABLE product READ;

// 解锁(将当前会话所有的表进行解锁)
UNLOCK TABLES;

写锁

// 写锁:其他连接不能查询和修改数据

-- 为product表添加写锁
LOCK TABLE product WRITE;