Java中乐观锁与悲观锁 - Go语言中文社区

Java中乐观锁与悲观锁


一、悲观锁

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

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

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

1. 读锁

select * from table lock in share mode

2. 写锁

select * from table for update

二、乐观锁

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

例如:

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

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

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

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

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/ScongHW/article/details/82804623
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-13 12:02:41
  • 阅读 ( 1031 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢