伴着如今互联网的热潮,数据多起来肯定就少不了高并发了,说到高并发就不得不说一说乐观锁,你知道如何解开乐观锁吗?乐观锁又该如何实现呢?快来跟小编一起学习学习吧。
乐观锁是什么?
首先我们先来粗略的了解一下乐观锁吧,这是一个数据库中常用的解决高并发的锁机制,乐观锁,顾名思义,一听就知道它是个老乐观的锁了,它的工作机制就是它在其他线程会来拿自己数据时乐观的认为它们是好线程,不会胡乱修改自己的数据的,所有它就不上锁了,但这个家伙又有点放心不下,所以在数据更新期间还是会判断一下这期间有没有不识趣的线程去修改这个数据。
乐观锁肯定是相对悲观锁而言的。乐观锁非常乐观,所以它采取的加锁机制也会更为宽松。乐观锁一般而言不会刻意去使用数据库本身的锁机制,它会依赖数据本身来保证数据的正确性。
乐观锁乐观,所以它相信事务之间的数据竞争的概率是比较小的,因此它会尽可能的直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁。这就是乐观锁机制,非常乐观的一个锁。
如何实现乐观锁?
例:
<!-- 乐观锁mapper --> <select id="queryLock" resultType="java.util.Map"> select upg,version from happy_lock </select> < update id = "editHappyLock" parameterType = "java.util.Map" > update happy_lock set upg = # { upg }, version = version + 1 where id = # { id } and version = # { version }; </update> 测试: @Test public void happyLock() { ExecutorService fixedThreadPool = Executors.newFixedThreadPool(20); for (int i = 0; i < 10; i++) { fixedThreadPool.execute(new Runnable() { @Override public void run() { try { Map < String, Object > map = new HashMap < > (); map.put("id", 1); Random rand = new Random(); Map < String, Object > mapTemp = nyHappyLockService.queryLock(); int randomCount = rand.nextInt(100); int upg = Integer.valueOf(mapTemp.get("upg") .toString()); int version = Integer.valueOf(mapTemp.get("version") .toString()); map.put("version", version); map.put("upg", (randomCount + version)); int count = nyHappyLockService.editHappyLock(map); System.out.println(Thread.currentThread() + " " + Thread.currentThread() .getName() + " 执行的结果数" + count); } catch (Exception e) { e.printStackTrace(); } } }); } }
执行结果:
已经提交的数据及版本号都大于数据库表当前版本号。可以看到后面的线程版本号都低于第一个版本 只有第一个会执行成功,后面的都会废弃。
以上就是关于乐观锁的全部内容,程序员之路不进则退,如果想要了解更多相关java常见问答知识,请关注并推荐我们奇Q工具网吧。
推荐阅读: