MySQL 乐观锁 悲观锁 共享锁 排他锁

乐观锁

乐观锁是逻辑概念上的锁,不是数据库自带的,需要我们自己去实现。乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,再去判断是否有冲突了。

通常实现是这样的:在表中的数据进行操作时(更新),先给数据表加一个版本(version)字段,每操作一次,将那条记录的版本号加1。也就是先查询出那条记录,获取出version字段,如果要对那条记录进行操作(更新),则先判断此刻version的值是否与刚刚查询出来时的version的值相等,如果相等,则说明这段期间,没有其他程序对其进行操作,则可以执行更新,将version字段的值加1;如果更新时发现此刻的version值与刚刚获取出来的version的值不相等,则说明这段期间已经有其他程序对其进行操作了,则不进行更新操作。

举例:

下单操作包括3步骤:

1.查询出商品信息

select (status,version) from t_goods where id=#{id}

2.根据商品信息生成订单

3.修改商品status为2

update t_goods  set status=2,version=version+1
 where id=#{id} and version=#{version};

悲观锁

与乐观锁相对应的就是悲观锁了。悲观锁就是在操作数据时,默认此操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作,这点跟java中的synchronized很相似,所以悲观锁需要耗费较多的时间。悲观锁的实现,依靠数据库提供的锁机制,使用的时候直接调用数据库的相关语句就可以了。

数据库上的操作可以归纳为两种:读和写。多个事务同时读取一个对象的时候,是不会有冲突的。同时读和写,或者同时写才会产生冲突。

MyIsam引擎会为查询和更新等操作自动添加表级锁,因此它的情况比较简单。InnoDB引擎情况比较复杂,它通常会定义两种锁:共享锁和排它锁。

共享锁

共享锁(Shared Lock,也叫S锁)表示对数据进行读操作,加锁后其他事务可以读,但不能写。多个事务可以同时为一个对象加共享锁。

SELECT ... LOCK IN SHARE MODE走的是IS锁(意向共享锁),即在符合条件的rows上都加了共享锁,这样的话,其他人可以读取这些记录,也可以继续添加IS锁,但是无法修改这些记录直到你这个加锁的过程执行完成(完成的情况有:事务的提交,事务的回滚,否则直接锁等待超时)。

SELECT ... LOCK IN SHARE MODE的应用场景适合于两张表存在关系时的写操作,拿mysql官方文档的例子来说,一个表是child表,一个是parent表,假设child表的某一列child_id映射到parent表的c_child_id列,那么从业务角度讲,此时我直接insert一条child_id=100记录到child表是存在风险的,因为刚insert的时候可能在parent表里删除了这条c_child_id=100的记录,那么业务数据就存在不一致的风险。正确的方法是再插入时执行select * from parent where c_child_id=100 lock in share mode,锁定了parent表的这条记录,然后执行insert into child(child_id) values (100)就不会存在这种问题了。

排它锁

排他锁(Exclusive Lock,也叫X锁)也叫写锁。加锁后,其他事务不能读取,也不能写。

如果一个事务对对象加了排他锁,其他事务就不能再给它加任何锁了。

产生排他锁的sql: SELECT ... FOR UPDATE

简单总结

共享锁适用于两张表存在业务关系时的一致性要求,排它锁适用于操作同一张表时的一致性要求。

原文地址:https://www.cnblogs.com/amunote/p/10354250.html

时间: 2024-08-01 05:40:32

MySQL 乐观锁 悲观锁 共享锁 排他锁的相关文章

获取数据库时间sql 以及行级锁总结-共享锁-排他锁-死锁

--TRUNC(date,[fmt]) /TRUNC(number[,decimals])SELECT SYSDATE FROM dual;SELECT TRUNC(SYSDATE) FROM dualSELECT TRUNC(12.34524,2) FROM dual;  --12.34SELECT TRUNC(-12.34724,2) FROM dual; --12.34SELECT TRUNC(12.34524,-1) FROM dual; --10--返回当前月的第一天 SELECT T

【转】Innodb 共享锁 排他锁 及应用

MySQL版本:5.6 注意点: 单纯的 SELECT 不会加锁,INSERT UPDATE DELETE 默认加 X . 文中的读都不是单纯 SELECT ,单纯的 SELECT 任何时候都可以进行. 共享锁 shared(S) lock 定义:A shared (S) lock permits the transaction that holds the lock to read a row. 事务 T1 获取了数据行 r 的共享锁,事务 T2 依然能获得 r 的共享锁,但不能获得排他锁.

浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景

浅谈Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--悲观锁(抽象性,不真实存在这个锁) |--乐观锁(抽象性,不真实存在这个锁) 二.InnoDB与MyISAM Mysql 在5.5之前默认使用 MyISAM 存储引擎,之后使用 InnoDB .查

mysql悲观锁中的共享锁和排他锁

概述: 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改. 排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改. 对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据,对于排他锁大家的理解可能就有些差别,我当初就犯了一个错误,以为排他锁锁住一行数据后,其他事务就不能读取

共享锁&排它锁 || 乐观锁&悲观索

1.共享锁只用于表级,排他锁用于行级. 2.加了共享锁的对象,可以继续加共享锁,不能再加排他锁.加了排他锁后,不能再加任何锁. 3.比如一个DML操作,就要对受影响的行加排他锁,这样就不允许再加别的锁,也就是说别的会话不能修改这些行.同时为了避免在做这个DML操作的时候,有别的会话执行DDL,修改表的定义,所以要在表上加共享锁,这样就阻止了DDL的操作. 4.当执行DDL操作时,就需要在全表上加排他锁 为什么需要锁(并发控制)? 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生

Mysql的共享锁和排他锁(转载)

mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流. 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改. 排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改. 对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据

mysql共享锁与排他锁

mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流. 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改. 排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改. 对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据

【mysql】关于悲观锁

关于mysql中的锁 在并发环境下,有可能会出现脏读(Dirty Read).不可重复读(Unrepeatable Read). 幻读(Phantom Read).更新丢失(Lost update)等情况,所以mysql引入了很多锁的概念 MySQL InnoDB对数据行的锁定类型一共有四种:共享锁(读锁,S锁).排他锁(写锁,X锁).意向共享锁(IS锁)和意向排他锁(IX锁),支持三种行锁定方式: 行锁(Record Lock):锁直接加在索引记录上面. 间隙锁(Gap Lock):锁加在不存

mysql什么情况下会触发表锁

锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素.从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂.本章我们着重讨论MySQL锁机制的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议. MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著