分布式系统——基于数据库的分布式锁实现

M君 1月前 ⋅ 127 阅读

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html

在分布式系统中,或者是系统多实例单数据源的系统中(同一个系统部署多分),这种情况下必然涉及到多个实例同时操作同一份数据,那么针对这种情况如果不使用分布式锁,那么就会数据更新错乱的问题,下面通过一个例子来说明

功能一:
// 查询实体A的数据信息
if(A.status == READY){
    // 执行启动逻辑
    A.status = STARTED
    B.status = BEGIN
}

.....

功能二:
// 查询实体A的信息
if(A.status == STARTED){
    // 执行启动之后的逻辑
    B.status = BEGIN
    A.status = DOING
}

 

功能一和功能二,如果在同一个系统执行,如果不加锁也会数据更新异常,那么在分布式系统中,就必须加分布式锁才行,原理和再本系统中一致。

在一般的系统中可以使用数据库锁实现,把两个功能放在事务中,查询实体的时候使用select ..... for update即可

功能一:
{//事务
    // 查询实体A的数据信息 select...for update
    if(A.status == READY){
        // 执行启动逻辑
        A.status = STARTED
        B.status = BEGIN
    }
}

.....

功能二:
{ // 事务
    // 查询实体A的信息 select...for update
    if(A.status == STARTED){
        // 执行启动之后的逻辑
        B.status = BEGIN
        A.status = DOING
    }
}

 


注意:本文归作者所有,未经作者允许,不得转载

全部评论: 0

    我有话说: