2数据库方式 · SpringCloud微服务实战 · 看云

导航

基于数据库的实现在互联网企业中是不会用到的,这里我们简单过一下,知道原理即可

1. 新建表

在mysql 数据库中任意新建一个库,并执行如下脚本创建表

DROP TABLE IF EXISTS `mysql_lock`;
CREATE TABLE `mysql_lock` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `method_name` varchar(64) NOT NULL COMMENT '锁定的方法名',
  `state` tinyint NOT NULL COMMENT '0:未分配;1:已分配',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `version` int NOT NULL COMMENT '版本号',
  `PRIMARY KEY (`id`),
  UNIQUE KEY `uidx_method_name` (`method_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='锁定的方法';

方案一(唯一索引)

获取锁

INSERT INTO mysql_lock(method_name, state,version) VALUES ('methodName',1,1);

对method_name做了唯一性约束,这里如果有多个请求同时提交到数据库的话,数据库会保证只有一个操作可以成功

方案二(乐观锁)

先获取锁的信息

     select id, method_name, state,version from mysql_lock where state=0 and method_name='methodName';

占有锁

       update mysql_lock set state=1, version=2, update_time=now() where method_name='methodName' and state=0 and version=2;

如果没有更新影响到一行数据,则说明这个资源已经被别人占了
缺点:
1、这把锁强依赖数据库的可用性
2、这把锁没有失效时间
3、这把锁只能是非阻塞的
4、这把锁是非重入的
优点:

  • 理解起来简单,不需要维护额外的第三方中间件