美文网首页程序员技术干货Java 杂谈
Ehcache WriteLock 解决数据并发操作

Ehcache WriteLock 解决数据并发操作

作者: 殷天文 | 来源:发表于2018-01-05 13:16 被阅读334次

    以下是shop++中的源码,通过ehcache缓存防止订单被同时操作

        public boolean acquireLock(Order order, User user) {
            Assert.notNull(order);
            Assert.isTrue(!order.isNew());
            Assert.notNull(user);
            Assert.isTrue(!user.isNew());
    
            Long orderId = order.getId();
            Ehcache cache = cacheManager.getEhcache(Order.ORDER_LOCK_CACHE_NAME);
            //获取写锁保证数据操作的准确性
            cache.acquireWriteLockOnKey(orderId);
            try {
                Element element = cache.get(orderId);
                //如果value不等于当前用户id, 说明当前订单被其他用户操作, 获取订单锁失败
                if (element != null && !user.getId().equals(element.getObjectValue())) {
                    return false;
                }
                cache.put(new Element(orderId, user.getId()));
            } finally {
                cache.releaseWriteLockOnKey(orderId);
            }
            return true;
        }
    
    <cache name="orderLock" maxElementsInMemory="1000000" timeToLiveSeconds="60" eternal="false" overflowToDisk="true" />
    
    当一个线程取得某一缓存key的read锁之后
    • 此线程不可以取得该key的write锁(即此线程不能写入该key的值);
    • 其他线程可以取得该key的read锁, 但不能取得write锁(即其他线程可以读取该key的值, 但不能写入). 要等到该线程(或所有线程)释放该key的read锁后, 才能获得write锁
    当一个线程取得某一缓存key的write锁之后
    • 此线程可以取得该key的read锁(即此线程可以读取该key的值);
    • 其他线程不可以取得该key的read锁和write锁(即其他线程不能读取或写入该key的值). 要等到该线程释放该key的write锁后才能获得.

    相关文章

      网友评论

        本文标题:Ehcache WriteLock 解决数据并发操作

        本文链接:https://www.haomeiwen.com/subject/lyojnxtx.html