悲观锁和乐观锁是不是mysql数据库默认带的锁

悲观锁和乐观锁是不是mysql数据库默认带的锁

1. 锁机制主要是针对读写操作的原子性。

2. 假设有两个事务执行同样的操作,读取数据、对数据进行处理、写入数据。事务A执行{读取数据},切换为事务B执行{读取数据、对数据进行处理、写入数据}。再切回事务A执行{对数据进行处理、写入数据}。就会发现事务A把事务B的操作覆盖掉了。

3. 悲观锁就是悲观的认为上述冲突发生的概率较高,就是事务在执行{读取数据}操作时,就对【数据】进行{加锁}操作,不允许其它事务去执行{加锁,写入数据}的操作。{加锁}操作是需要耗费资源的,如果冲突发生的概率较低,是不划算的。MySQL的加锁{悲观锁}操作可以通过select .... for update语法实现。

4. 乐观锁是乐观的认为上述冲突发生的概率较低,就是在表中约定一个版本标志字段,每次变更时去修改这个版本标志(可以是一个递增版本号,也可以是时间戳)。每个事务执行{读取数据}操作时,会读取到这个字段,执行{写入数据}操作时,判断版本标志是否发生改变(通过where条件判断即可),如果有变更,应用程序就重新执行{读取数据、对数据进行处理、写入数据}操作或者退出。MySQL本事是没有乐观锁这个概念的,需要应用程序自己去实现。

悲观锁和乐观锁只是一种概念,不特属某一个语言。mysql 数据库只能说应该用了对应概念的一种实现,mysql 也只是一款应用,你要问也应该问编写 mysql 的语言是不是有对应概念的实现。

默认的是无状态锁,悲观锁和乐观锁要具体实现

mysql的锁分类
从性能上分为乐观锁(用版本对比来实现)和悲观锁
从对数据库操作的类型分,分为读锁和写锁 (都属于悲观锁)
读锁(共享锁,S锁(Shared)):针对同一份数据,多个读操作可以同时进行而不会互相影响
写锁(排它锁,X锁(eXclusive)):当前写操作没有完成前,它会阻断其他写锁和读锁
从对数据操作的粒度分,分为表锁和行锁

这个只是用户行为的一种概念,乐观锁就是无锁概念 以版本号去控制能不能改,悲观锁是真的加锁
粒度:表锁 行锁 页锁
类型:共享 排它 意向共享、意向排它
用户:乐观锁 悲观锁
算法:记录锁 临键锁 间隙锁