分布式锁


1、行级锁(悲观锁)
1)SET AUTOCOMMIT=0;
SELECT * FROM activity l WHERE l.id = 1 FOR UPDATE;
会锁定一条数据id=1 其他线程修改的操作都不能操作这条数据;可以select
COMMIT;

commit之后其他线程才能操作这条数据

2)加行锁的字段要加索引

InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!
    在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。

2、数据库版本控制(乐观锁)

乐观锁,大多是基于数据库版本 Version记录机制实现。

数据库版本:数据增加一个版本标识,在基于数据库表的版本解决方案中, 一般是通过微数据库表增加一个“version”

 字段来实现。读取数据时,将此版本号一同读出,之后更新时,对此版本号加1.此时,将提交数据的版本数据与数据库表对应记录的的当前版本信息进行对比。

3、基于内存服务器原子性操作或campare and set,比如redis/memcached缓存服务器

   

    /**
     * 尝试获得锁资源
     *
     * @param id
     * @return
     */
    public static boolean tryLock(String id) {
        RedisClient redisClient = RedisUtils.getRedisClient();
        try {
            return redisClient.add(id, 100, "value");
            //最好给锁资源设置一个有效时间
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 尝试释放锁资
     *
     * @param id
     * @return
     */
    public static boolean releaseLock(String id) {
        RedisClient redisClient = RedisUtils.getRedisClient();
        try {
            return redisClient.delete(id);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    public static void main(String[] args) {
        String id = "xxx";
        try {
            boolean getLock = tryLock(id);
            if (getLock) {//如果获得锁资源
                // doSomething()...
            }
        } finally {
            releaseLock(id);
            //不论执行业务执行成功与否都要释放资源
        }
        //使用锁一定要将代码块放入try..catch..finally代码块中
    }

4、基于消息通信的协调服务的zookeeper实现




参考:http://www.cnblogs.com/chenqionghe/p/4845693.html

            http://www.cnblogs.com/luyucheng/p/6297752.html

            http://blog.csdn.Net/nicewuranran/article/details/51730131

            http://blog.csdn.NET/libing13820393394/article/details/46428889


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值