乐观锁 和 悲观锁 是针对处理并发资源的采用的方式
与mysql中提供的锁机制(表锁,行锁,排他锁,共享锁)不能混为一谈
悲观锁:就是对于数据的处理持悲观态度,总认为会发生并发冲突,获取和修改数据时,别人会修改数据。所以在整个数据处理过程中,需要将数据锁。
乐观锁:顾名思义,就是对数据的处理持乐观态度,乐观的认为数据一般情况下不会发生冲突,只有提交数据更新时,才会对数据是否冲突进行检测。如果检测有冲突,交给用户处理。
悲观锁实现:
- 利用 数据库 锁机制
- 比如mysql的排他锁,select .... for update来实现悲观锁
- 需要关闭mysql自动提交功能,set autocommit = 0
乐观锁实现:
- 给表加一个版本号或时间戳的字段,读取数据时,将版本号一同读出,数据更新时,将版本号加1或者更新时间戳。
- 当我们提交数据更新时,判断当前的版本号与第一次读取出来的版本号是否相等。如果相等,则予以更新,否则认为数据过期,拒绝更新,让用户重新操作。
- 程序处理,不会产生死锁