社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
顾名思义,悲观锁就是考虑事情发生的最坏情况。默认认为一定会有其它线程抢着修改当前线程正在使用的数据。分为,读锁和写锁。
如何实现(数据库提供实现方法):
1. 读锁
select * from table lock in share mode
2. 写锁
select * from table for update
乐观锁,认为没有其它线程和本线程同时修改数据。一般使用版本号来控制(类似于SVN版本控制器),在提交事务前,比较自身持有的版本号和数据库中存在的版本号,只有自身持有的版本号大于数据库中的版本号时才能修改数据,否则无法修改数据。
例如:
在hibernate中,提供了乐观锁的解决方案
首先,在实体类中,添加一个字段代表版本号,并添加get/set方法。
然后在实体的配置文件中添加version属性
结果:在测试代码中加入断点,当程序运行完该断点后,立即修改数据库t_customer表中version属性,使其加1,放行代码,结果将出现SatleObjectStateException异常。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!