面试官竟和我说for update是乐观锁
乐观锁、悲观锁
按我的理解来说,乐观锁不是锁,是无锁机制,不锁数据。悲观锁会把要使用的数据锁住,不让别人修改。
数据库
在mysql中,更新前先取版本号或者时间戳,更新的时候带上先前取的版本号或者时间戳,这就是乐观锁。
思想上和CAS也是异曲同工。
mysql默认隔离级别是可重复读,显式使用for update,会给这条记录加上临键锁。
innodb默认支持事务,假设有两个事务都使用版本号机制去更新表,更新前都拿到相同的版本号,但是更新时update使用当前读,两者一定会在最新数据的基础上做更新,所以一个事务更新成功,一个更新失败。
这里再深入一点,如果多个事务就是同一时间点去执行update,那么会通过加锁排队执行,一个事务完了之后,才唤醒另一个事务继续执行,所以同一时间点更新同一条数据是不存在。
版权声明:本文所有权归作者! 商业用途转载请联系作者授权! 非商业用途转载,请标明本文链接及出处!
赞成、反驳、不解的小伙伴,欢迎一起交流!

浙公网安备 33010602011771号