Java中乐观锁与悲观锁

一、悲观锁

顾名思义,悲观锁就是考虑事情发生的最坏情况。默认认为一定会有其它线程抢着修改当前线程正在使用的数据。分为,读锁和写锁。

  • 读锁,又称共享锁,可以被其它线程所共享,所有线程都可以添加该锁。当没有其它线程添加读锁时,本线程可以修改数据,否则将无法修改数据。
  • 写锁,也成排它锁,不能被共享。只要有线程添加该锁时,直到事务提交之前,其它线程都无法添加该锁。

如何实现(数据库提供实现方法):

1. 读锁

select * from table lock in share mode

2. 写锁

select * from table for update

二、乐观锁

乐观锁,认为没有其它线程和本线程同时修改数据。一般使用版本号来控制(类似于SVN版本控制器),在提交事务前,比较自身持有的版本号和数据库中存在的版本号,只有自身持有的版本号大于数据库中的版本号时才能修改数据,否则无法修改数据。

例如:

在hibernate中,提供了乐观锁的解决方案

首先,在实体类中,添加一个字段代表版本号,并添加get/set方法。

Java中乐观锁与悲观锁_第1张图片

然后在实体的配置文件中添加version属性

Java中乐观锁与悲观锁_第2张图片

 结果:在测试代码中加入断点,当程序运行完该断点后,立即修改数据库t_customer表中version属性,使其加1,放行代码,结果将出现SatleObjectStateException异常。

Java中乐观锁与悲观锁_第3张图片

 Java中乐观锁与悲观锁_第4张图片

你可能感兴趣的:(Java)