悲观锁:悲观的觉得别人一定会修改我的数据。悲观锁有两种,读锁和写锁。
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.所以,小红的提交无效。