数据库中悲观锁和乐观锁

 

悲观锁:悲观的觉得别人一定会修改我的数据。悲观锁有两种,读锁和写锁。

 1.读锁:也叫共享锁。共享数据对象上锁权,大家都可以上锁,我上了一把读锁,你也可以上,但是只能上共享锁。可以使自己和别人不能修改数据,只能读取。

我开启事务

select * from student    LOCK IN  SHARE MODE

//把select出来的数据对象锁定

update student  set age='18'  where name='小强'

 //这里,我要修改小强的年龄age成18岁,是可以修改成功的

//因为锁是我的,我有钥匙。但是,当下面的小红开启事务,然后锁上数据对象,

//我就无法对数据进行修改

//除非锁被释放(不存在锁了)或者只有一个人持有锁,才可以对修改数据

我关闭事务

小红开启事务

select * from student    LOCK IN  SHARE MODE

//小红把select出来的数据对象锁住了,我没有钥匙是无法开门的,小红也没有我的 //钥匙,现在大家都只能读了

小红关闭事务

 2.写锁:也叫排他锁:不共享数据对象上锁权,我上了锁,你们就不能上锁。有锁钥匙的事务可以修改,读取。

  开启事务

SELECT *FROM student FOR UPDATE;

//现在这个数据对象只有我一个人可以修改,别人不可以加锁,也不能修改数据

关闭事务

乐观锁:乐观锁机制避免了长事务中的数据库加锁开销,大大提升了大并发量下的系统整体性能表现。

通过版本号来控制,数据版本是1,我和小红同时对数据进行修改,在事务提交前,我和小红的程序内部获取的数据版本都是1,所以提交的时候,版本是2.修改后,我先提交,数据版本为2,小红提交时想把数据版本变成2,但是不好意思,只有数据版本只能是3.所以,小红的提交无效。

原文地址:https://www.cnblogs.com/shoshana-kong/p/10736945.html