程序员技术干货Java 杂谈

Ehcache WriteLock 解决数据并发操作

2018-01-05  本文已影响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锁之后
上一篇 下一篇

猜你喜欢

热点阅读