MySQL 的乐观锁和悲观锁了解吗?

  • 悲观锁(Pessimistic Concurrency Control):

悲观锁认为受保护的数据极不安全,随时可能被修改。当一个事务获取了悲观锁后,其他事务无法修改该数据,只能等待锁释放后才能执行。

在数据库中,行级锁、表级锁、读锁和写锁都属于悲观锁。

  • 乐观锁(Optimistic Concurrency Control)

乐观锁认为数据的变动不频繁。

乐观锁通常通过在表中添加一个版本号(version)或时间戳(timestamp)来实现,其中版本号是最常用的方式。

当事务从数据库中取出数据时,会同时获取该数据的版本号(v1)。当事务完成数据修改并尝试更新到表中时,会将之前获取的版本号 v1 与当前数据的最新版本号 v2 进行比较。如果 v1 等于 v2,说明在数据变动期间没有其他事务修改数据,此时允许事务更新表中的数据,并将版本号加1,表示数据已经变动。

如果 v1 不等于 v2,说明在数据变动期间有其他事务修改了数据,此时不允许事务将数据更新到表中。通常的处理方法是通知用户重新操作。与悲观锁不同,乐观锁通常由开发者自行实现。

标签: java, Java面试题, MySQL, Java问题合集, MySQL面试题, Java编程, Java问题精选, Java常见问题