当前位置: 首页 > news >正文

Mysql中的事务、锁、日志详解

一、事务

1.事务特性及保证事务特性的原理
  1. 原子性:当前事务的操作要么全部成功,要么全部失败。原子性由undo log实现,undo log记录了每次操作之前的数据版本,如果某一操作失败,可以根据undo log回滚到最初状态。
  2. 一致性:事务执行前后,变化一致。由其它三个特性和正确逻辑来保证。
  3. 隔离性:在事务执行时,他们内部的操作不能互相干扰。隔离性由Mysql的各种锁和MVCC机制实现(MVCC机制是多版本并发控制,专门用来保证并发事务时读已提交和读未提交隔离性。具体是通过一致性视图 read view和undo 版本链通过一致性算法比对规则来保证)。
  4. 持久性:一旦事务提交,它对数据库的改变就是永久的。持久性由redo log实现。
  • 关于readview和可见性算法的原理解释
    readview和可见性算法其实就是记录了sql查询那个时刻数据库里提交和未提交所有事务的状态。
    要实现RR隔离级别,事务里每次执行查询操作readview都是使用第一次查询时生成的readview,也就是都是以第一次查询时当时数据库里所有事务提交状态来比对数据是否可见,当然可以实现每次查询的可重复读的效果了。
    要实现RC隔离级别,事务里每次执行查询操作readview都会按照数据库当前状态重新生成readview,也就是每次查询都是跟数据库里当前所有事务提交状态来比对数据是否可见,当然实现的就是每次都能查到已提交的最新数据效果了。
2.事务隔离级别及存在问题
隔离级别脏读不可重复读幻读
读未提交可能可能可能
读已提交不可能可能可能
可重复读不可能不可能可能
串行化不可能不可能不可能
  • 读未提交(Read uncommitted):一个事务可以读到另一个事务还未提交的内容
  • 读已提交(Read committed):一个事务可以读到另一个事务已经提交的内容
  • 可重复读(Repeatableread):一旦事务开启,每次读取的内容都是相同的
  • 串行化(Serializable):通过加锁的方式,让操作数据库的事务按顺序执行
3.事务问题定位
-- 查看当前数据库的事务隔离级别: 
show variables like 'tx_isolation';
-- 设置事务隔离级别:
set tx_isolation='REPEATABLE-READ';
-- 查询执行时间超过1秒的事务
select *from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>1;
-- 强制结束事务
kill 事务对应的线程id(trx_mysql_thread_id字段)

二、锁

1.锁按性能分:
  • 乐观锁:不会对操作的数据直接加锁,而是通过操作前比较版本和每次操作之后修改版本实现。适用于读多写少的场景,写数据较多时会造成cpu空转效率降低。
  • 悲观锁:对数据操作前先获取锁避免其它线程操作干扰,读锁和写锁都是悲观锁。
-- 读锁
select * from T where id=1 lock in share mode
-- 写锁
select * from T where id=1 for update
  • 意向锁:意向锁主要是mysql为了提高加表锁的效率自己加的。当需要给一个表加表锁时需要逐行判断有没有行锁,有了意向锁当有事务给表的数据增加了行锁或者排他锁时,会给表设置一个标识。这样再加表锁时就无需逐行判断。
2.锁按粒度分:
  • 表锁:针对于整个表加锁。开销小,加锁快。一般用在整张表迁移的场景
-- 手动增加表锁
lock table 表名称 read(write),表名称2 read(write);
-- 查看表上加过的锁
show open tables;
-- 删除表锁
unlock tables;
  • 行锁:针对某一行数据加锁,开销大,加锁慢会出现死锁。
    注意: 行锁是加在索引上,不是加在整行上。如果索引失效或者没有针对索引加锁,会造成行锁升级为表锁(RR级别会升级为表锁,RC级别不会升级)。
    问题:为什么行锁升级表锁针对RR级别。因为RR级别为了保证可重复读,扫描过的数据就不允许其它事务修改或者间隙内被其它事务插入数据(幻读)从从而导致数据不一致,所以Mysql的做法是把所有扫描过的索引和间隙都加锁
-- 怎对隔离级别为 RR
‐‐where条件里的name字段无索引 所以会升级为表锁
select * from account where name = 'lilei' for update; 
3.间隙锁、临键锁(为了解决RR级别下的幻读问题)
  • 间隙锁:锁的是两个值之间的空隙。间隙锁是针对RR级别才生效
  • 临键锁:除了锁主两个值的间隙,还会锁主两个值本身
4.锁问题分析
-- 查看系统上的行锁的争夺情况
show status like 'innodb_row_lock%';-- 查看事务
select * from INFORMATION_SCHEMA.INNODB_TRX;
-- 查看锁,8.0之后需要换成这张表performance_schema.data_locks
select * from INFORMATION_SCHEMA.INNODB_LOCKS;  
-- 查看锁等待,8.0之后需要换成这张表performance_schema.data_lock_waits
select * from INFORMATION_SCHEMA.INNODB_LOCK_WAITS;  -- 释放锁,trx_mysql_thread_id可以从INNODB_TRX表里查看到
kill trx_mysql_thread_id-- 查看锁等待详细信息
show engine innodb status; 

三、日志

1.redo日志
  • 1.redo日志作用:如果事务提交成功,buffer pool 里的数据还没来得及写入磁盘,此时系统宕机了就可以用redo log来恢复磁盘文件ibd里的数据。

  • 2.redo日志写过程:事务提交时先把日志写在redo log buffer中,调用操作系统函数 write写道文件系统的page cache,然后调用操作系统函数的fsync持久化到磁盘文件。

  • 3.重要参数

-- 这个参数控制 redo log 的写入策略
innodb_flush_log_at_trx_commit:0:每次事务提交都只把redo log日志写在redo log buffer中1:每次事务提交把redolog日志直接持久化到磁盘2:每次事务提交把redolog日志写到操作系统的page cach中# 查看innodb_flush_log_at_trx_commit参数值:
show variables like 'innodb_flush_log_at_trx_commit';
# 设置innodb_flush_log_at_trx_commit参数值(也可以在my.ini或my.cnf文件里配置):
set global innodb_flush_log_at_trx_commit=1;  
2.binlog日志

binlog 作用:binlog是二进制日志,保存了所有执行过的修改操作语句。如果mysql数据库意外停止,可以用来恢复数据库数据。

# 查看binlog相关参数
show variables like '%log_bin%';log_bin:binlog日志是否打开状态
log_bin_basename:是binlog日志的基本文件名,后面会追加标识来表示每一个文件,binlog日志文件会滚动增加
log_bin_index:指定的是binlog文件的索引文件,这个文件管理了所有的binlog文件的目录。
sql_log_bin:sql语句是否写入binlog文件,ON代表需要写入,OFF代表不需要写入。如果想在主库上执行一些操作,但不复制到slave库上,可以通过修改参数sql_log_bin来实现。比如说,模拟主从同步复制异常。

开启binlog
打开binlog功能,需要修改配置文件my.ini(windows)或my.cnf(linux),然后重启数据库。在配置文件中的[mysqld]部分增加如下配置:

# log-bin设置binlog的存放位置,可以是绝对路径,也可以是相对路径,这里写的相对路径,则binlog文件默认会放在data数据目录下
log-bin=mysql-binlog
# Server Id是数据库服务器id,随便写一个数都可以,这个id用来在mysql集群环境中标记唯一mysql服务器,集群环境中每台mysql服务器的id不能一样,不加启动会报错
server-id=1
# 其他配置
binlog_format = row # 日志文件格式,下面会详细解释
expire_logs_days = 15 # 执行自动删除距离当前15天以前的binlog日志文件的天数, 默认为0, 表示不自动删除
max_binlog_size = 200M # 单个binlog日志文件的大小限制,默认为 1GB

binlog写入磁盘机制
binlog写入磁盘机制主要通过 sync_binlog 参数控制,默认值是 0

  • 0:每次提交事务都只写到page cach
  • 1:每次提交都会写到磁盘
  • N:每次提交事务只写道 page cach,积累N个后写到磁盘
    binlog日志格式
    用参数 binlog_format 可以设置binlog日志的记录格式。
  • STATEMENT:基于SQL语句的复制,每一条会修改数据的sql都会记录到master机器的bin-log中,这种方式日志量小。但是对于一些执行过程中才能确定结果的函数,比如UUID()、SYSDATE()等函数如果随sql同步到slave机器去执行,则结果跟master机器执行的不一样
  • ROW:基于行的复制,日志中会记录成每一行数据被修改的形式。这种方式日志量较大,性能不如Statement
  • MIXED:混合模式复制,实际就是前两种模式的结合。在Mixed模式下,如果sql里有函数或一些在执行时才知道结果的情况,会选择Row,其它情况选择Statement,推荐使用这一种

查看binlog日志文件

# 查看bin-log二进制文件(命令行方式,不用登录mysql)
mysqlbinlog --no-defaults -v --base64-output=decode-rows D:/user/mysql-5.7.25-winx64/data/mysql-binlog.000001 # 查看bin-log二进制文件(带查询条件)
mysqlbinlog --no-defaults -v --base64-output=decode-rows D:/user/mysql-5.7.25-winx64/data/mysql-binlog.000001 start-datetime="2023-01-21 00:00:00" stop-datetime="2023-02-01 00:00:00" start-position="5000" stop-position="20000"

使用binlog日志恢复被删除数据

# 1.先执行刷新日志的命令生成一个新的binlog文件mysql-binlog.000008,后面我们的修改操作日志都会记录在最新的这个文件里
flush logs;
# 2.执行两条插入语句
INSERT INTO `test`.`account` (`id`, `name`, `balance`) VALUES ('4', 'zhuge', '666');
INSERT INTO `test`.`account` (`id`, `name`, `balance`) VALUES ('5', 'zhuge1', '888');
# 3.假设现在误操作执行了一条删除语句把刚新增的两条数据删掉了
delete from account where id > 3;
# 4.查看binlog日志文件
mysqlbinlog --no-defaults -v --base64-output=decode-rows D:/dev/mysql-5.7.25-winx64/data/mysql-binlog.000002
# 5.找到第一条sql BEGIN前面的文件位置标识 at 219(这是文件的位置标识),再找到第二条sql COMMIT后面的文件位置标识 at 701
mysqlbinlog  --no-defaults --start-position=219 --stop-position=701 --database=test D:/user/mysql-5.7.25-winx64/data/mysql-binlog.000002 | mysql -uroot -p123456 -v test

以上步骤执行完被删除数据被恢复!
dump备份
如果要全量数据同步或者备份,直接使用dump将全量数据保存下来。

mysqldump -u root 数据库名>备份文件名;   #备份整个数据库
mysqldump -u root 数据库名 表名字>备份文件名;  #备份整个表mysql -u root test < 备份文件名 #恢复整个数据库,test为数据库名称,需要自己先建一个数据库test
3.undo日志

undo日志主要用来记录每一步修改操作前的数据,方便事务执行失败后回滚。

innodb_undo_directory:设置undo log文件所在的路径。该参数的默认值为"./",即innodb数据文件存储位置,目录下ibdata1文件就是undo log存储的位置。
innodb_undo_logs: 设置undo log文件内部回滚段的个数,默认值为128。
innodb_undo_tablespaces: 设置undo log文件的数量,这样回滚段可以较为平均地分布在多个文件中。设置该参数后,会在路径innodb_undo_directory看到undo为前缀的文件。

相关文章:

Mysql中的事务、锁、日志详解

一、事务 1.事务特性及保证事务特性的原理 原子性&#xff1a;当前事务的操作要么全部成功&#xff0c;要么全部失败。原子性由undo log实现&#xff0c;undo log记录了每次操作之前的数据版本&#xff0c;如果某一操作失败&#xff0c;可以根据undo log回滚到最初状态。一致…...

k8s笔记24--安装metrics-server及错误处理

k8s笔记24--安装metrics-server及错误处理1 介绍2 安装3 常见错误第一次错误 持续 Failed probe第二次错误 bad status code "403 Forbidden"4 说明1 介绍 最近一个同事在老版本的 k8s 上安装metrics-server&#xff0c;pod一直处于running 非就绪状态&#xff0c;经…...

【电商】订单系统--售后的简易流程与系统关系

用户进行了订单签收并不意味着终结&#xff0c;这只是一个新的开始&#xff0c;因为商品送达后可能会由于运输过程包装或商品有破损&#xff0c;商品本质量并非商品详情中所描述的那样等各种原因使用户进行退货或换货&#xff1b;还有一种场景是用户签收后发现有的商品漏发、少…...

低代码开发平台|生产管理-成本核算搭建指南

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建生产管理-成本核算。1.2、应用场景计算主生产及子生产计划的工序成本、领料成本&#xff0c;统计出总的生产成本金额。2、设置方法2.1、表单搭建1&#xff09;新建表单【商品信息】&#xff0c;字段设置如下&#xff1b;名称…...

Xshell 安装及使用方法

公网地址&#xff1a;47.XXX.XXX.229 私网地址&#xff1a;172.XXX.128.XXX 用户&#xff1a;root 密码&#xff1a;1234561,百度xshell&#xff0c;下载&#xff0c;安装Xshell 2&#xff0c;填写配置及使用方式 主机&#xff1a;47.XXX.XXX.229 用户&#xff1a;root 密码&a…...

【Axure教程】转盘抽奖原型模板

转盘抽奖是营销活动中很常用的一种方式&#xff0c;在线上我们也可以经常看到转盘抽奖的活动&#xff0c;所以今天作者就教大家在Axure中怎么制作一个转盘抽奖的原型模板。一、效果展示1、可以随机转动轮盘&#xff0c;轮盘停止时&#xff0c;指针对着的奖品高亮显示2、可以重复…...

量子比特大突破!原子薄材料成为“救世主”

&#xff08;图片来源&#xff1a;网络&#xff09;量子计算是一项极其复杂的技术&#xff0c;现阶段的一些挑战正严重阻碍着它的发展&#xff0c;尤其是量子比特的小型化和质量问题。IBM计划在2023年实现具有1121个超导量子比特的处理器。以目前的技术手段&#xff0c;要达到这…...

Swagger3 API接口文档规范课程(内含教学视频+源代码)

Swagger3 API接口文档规范课程&#xff08;内含教学视频源代码&#xff09; 教学视频源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87431932 目录Swagger3 API接口文档规范课程&#xff08;内含教学视频源代码&#xff09;教学视频源代…...

数据库的基本操作

查看数据库语法格式&#xff1a;SHOW {DATABASES | SCHEMAS}[LIKE pattern | WHERE expr]#查看全部数据库mysql> show databases; -------------------- | Database | -------------------- | information_schema | | mysql | | performance_schema …...

分享5个超好用的Vue.js库

开发人员最好的朋友和救星就是这些第三方库&#xff0c;无论是开发新手还是经验丰富的老手&#xff0c;我们都喜欢开源软件包。借助开源库加速Vue项目的开发进度是现代前端开发比较常见的方式&#xff0c;这几个 Vue.js库&#xff0c;建议尽早用上&#xff0c;加速你的项目开发…...

第四章.误差反向传播法—ReLU/Sigmoid/Affine/Softmax-with-Loss层的实现

第四章.误差反向传播法 4.2 ReLU/Sigmoid/Affine/Softmax-with-Loss层的实现 1.ReLU层 1).公式 2).导数&#xff1a; 3).计算图&#xff1a; 4).实现&#xff1a; class ReLU:def __init__(self):self.mask None# 正向传播def forward(self, x):self.mask (x < 0) # 输入…...

Python-第二天 Python基础语法

Python-第二天 Python基础语法一、 字面量1.1 常用的值类型1.1.1 字符串&#xff08;string&#xff09;二、注释2.1 注释的作用2.2 注释的分类三、变量3.1 什么是变量3.2 变量的特征四、数据类型4.1 数据类型4.2 type()语句4.3 type()语句的使用方式4.4 变量有类型吗&#xff…...

命令模式包含哪些主要角色?怎样实现命令?

命令模式包含以下主要角色&#xff1a;抽象命令类&#xff08;Command&#xff09;角色&#xff1a; 定义命令的接口&#xff0c;声明执行的方法。具体命令&#xff08;Concrete Command&#xff09;角色&#xff1a;具体的命令&#xff0c;实现命令接口&#xff1b;通常会持有…...

SpringCloud-Feign

Spring Cloud中集成Feign (只是笔记而已 其中有点命名啥的不对应&#xff0c;搜到了就划走吧) Feign--[feɪn]&#xff1a;Web 服务客户端&#xff0c;能够简化 HTTP 接口的调用。 没有Feign的之前服务提供者 package com.springcloudprovide.controller;import com.springclo…...

XCP实战系列介绍08-基于Vehicle Spy进行XCP测量的工程配置详解

本文框架 1.概述2. 工程配置步骤2.1 创建MEP工程2.1.1 添加A2L文件2.1.2 CAN收发ID配置2.2 MEP属性设置2.2.1 ECU属性设置2.2.2 MEP的Security设置2.3 DAQ设置2.3.1创建DAQ2.3.2 list中测量及标定量的添加和设置2.3.3 设置DAQ list中变量的event1.概述 在前面一篇文章《看了就…...

JVM调优几款好用的内存分析工具

对于高并发访问量的电商、物联网、金融、社交等系统来说&#xff0c;JVM内存优化是非常有必要的&#xff0c;可以提高系统的吞吐量和性能。通常调优的首选方式是减少FGC次数或者FGC时间&#xff0c;以避免系统过多地暂停。FGC达到理想值后&#xff0c;比如一天或者两天触发一次…...

Vue中路由缓存及activated与deactivated的详解

目录前言一&#xff0c;路由缓存1.1 引子1.2 路由缓存的方法1.2.1 keep-alive1.2.2 keep-alive标签中的include属性1.2.3 include中多组件的配置二&#xff0c;activated与deactivated2.1 引子2.2 介绍activated与deactivated2.3 解决需求三&#xff0c;整体代码总结前言 在Vu…...

【漏洞复现】phpStudy 小皮 Windows面板 RCE漏洞

文章目录前言一、漏洞描述二、漏洞复现前言 本篇文章仅用于漏洞复现研究和学习&#xff0c;切勿从事非法攻击行为&#xff0c;切记&#xff01; 一、漏洞描述 Phpstudy小皮面板存在RCE漏洞&#xff0c;通过分析和复现方式发现其实本质上是一个存储型XSS漏洞导致的RCE。通过系…...

跨域小样本系列2:常用数据集与任务设定详解

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 带你学习跨域小样本系列1-简介篇 跨域小样本系列2-常用数据集与任务设定详解&#xff08;本篇&#xff09; 跨域小样本系列3&#xff1a;元学习方法解决CDFSL以及两篇SOTA论文讲解 跨域小样本系列4&#xf…...

HTML浪漫动态表白代码+音乐(附源码)

HTML浪漫表白求爱(附源码)&#xff0c;内含4款浪漫的表白源码&#xff0c;可用于520&#xff0c;情人节&#xff0c;生日&#xff0c;求爱场景&#xff0c;下载直接使用。 直接上源码吧 一.红色爱心 1.效果 实际效果是动态的哦 2.源码 复制粘贴即可运行哦 <!DOCTYPE…...

The last packet sent successfully to the server was 0 milliseconds ago. 解决办法

mybatis-generator-maven-plugin插件The last packet sent successfully to the server was 0 milliseconds agoYou must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to…...

分布式高级篇1 —— 全文检索

Elasticsearch Elasticsearch简介一、基本概念1、index(索引)2、Type(类型)3、Document(文档)4、倒排索引二、Docker 安装 EL1、拉取镜像2、创建实例三、初步探索1、_cat2、索引一个文档(保存)3、查询文档3、更新文档4、删除文档&索引5、_bulk 批量 AP6、样本测试数据四、进…...

集成电路开发及应用-模拟数字部分专栏目录

三角波发生器电路图分析_XMJYBY的博客-CSDN博客运算放大器正反馈负反馈判别法_如何理解运算放大器的反馈机制,分哪几种_XMJYBY的博客-CSDN博客运算放大器实现多路同向反向加减运算电路公式推导(一)_反向减法运算电路_XMJYBY的博客-CSDN博客运算放大器实现多路同向反向加减运算电…...

ios使用SARUnArchiveANY 解压rar文件(oc和swift版本)

SARUnArchiveANY简介 开源库网址&#xff1a; https://github.com/saru2020/SARUnArchiveANY 简介&#xff1a; 一个iOS的非常有用的库来解压zip&#xff0c;.rar&#xff0c;7z文件。 他是以下库的简单集成&#xff1a; UnrarKitSSZipArchiveLzmaSDKObjC (7z) 需要注意的是…...

【Python学习笔记】21.Python3 函数(2)

前言 本章介绍调用函数时可使用的正式参数。 参数 以下是调用函数时可使用的正式参数类型&#xff1a; 必需参数关键字参数默认参数不定长参数 必需参数 必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。 调用 printme() 函数&#xff0c;你必须传入一…...

day57回文子串_最长回文子序列

力扣647.回文子串 题目链接&#xff1a;https://leetcode.cn/problems/palindromic-substrings/ 思路 dp数组含义 dp[i][j]:以s[i]为开头&#xff0c;s[j]为结尾的子串是否是回文子串 递推公式 子串范围为[i,j]&#xff0c;当s[i]s[j]时&#xff0c;有三种情况&#xff1…...

Element UI框架学习篇(二)

Element UI框架学习篇(二) 1 整体布局 1.1 前提说明 el-container标签里面的标签默认是从左往右排列,若想要从上往下排列,只需要写el-header或者el-footer就行了 <el-container>&#xff1a;外层容器 <el-header>&#xff1a;顶栏容器。 <el-aside>&#…...

【C++】类与对象(上)

文章目录一、面向过程和面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及封装①访问限定符②封装五、类的作用域六、类的实例化七、类对象模型①如何计算类对象大小②类对象的存储方式③结构体中内存对齐规则八、this指针①this指针的引出②this指针的特性一、面…...

Leetcode.1797 设计一个验证系统

题目链接 Leetcode.1797 设计一个验证系统 Rating : 1534 题目描述 你需要设计一个包含验证码的验证系统。每一次验证中&#xff0c;用户会收到一个新的验证码&#xff0c;这个验证码在 currentTime时刻之后 timeToLive秒过期。如果验证码被更新了&#xff0c;那么它会在 curr…...

Kaldi - 数据文件准备

文章目录数据文件准备wav.scputt2spkspk2utttext相关代码根据文件生成 utt2spk 和 wav.scputt2spk -- spk2utt 转换数据文件准备 在训练/解码中&#xff1a; 有三个文件是必要的&#xff1a; wav.scp 语音编号 – 路径信息utt2spk 语音编号 – 说话人编号spk2utt 说话人编号 …...

怎么做传奇私服广告网站/站长工具麻豆

关于如何集成spring-data-mongodb到项目中&#xff0c;已经有很多人介绍了&#xff0c;这里只给出几个链接。GETTING STARTED Accessing Data with MongoDB&#xff1a; http://spring.io/guides/gs/accessing-data-mongodb/MongoDB初探(二)----使用spring-data配置mongodb &am…...

wordpress音乐盒/东莞seo网站排名优化公司

1. 流水线实现多周期指令简图2. MIPS流水线基本流程1. 取指令&#xff1b;2. 读寄存器和译码&#xff1b;3. 执行ALU和地址计算&#xff1b;4. 存储器访问&#xff1b;5. 写结果到寄存器。3. 非流水与流水的对比&#xff1a;非流水的执行时间– 3条指令共需3800&#xff1d;240…...

罗定建设局网站/最新做做网站

文章目录使styled-component 像SPA中使用step1 安装插件step2 根目录下创建 .babelrcstep3 创建page/_document.js自定义 Document参考 特别感谢[应用主题] 需完成上一步使styled-component 像SPA中使用 step1 安装插件 yarn add babel-plugin-styled-componentsstep2 根目录…...

wordpress 雪花插件/河南疫情最新情况

cut 命令在Linux和Unix中的作用是从文件中的每一行中截取出一些部分&#xff0c;并输出到标准输出中。我们可以使用 cut 命令从一行字符串中于以字节&#xff0c;字符&#xff0c;字段&#xff08;分隔符&#xff09;等单位截取一部分内容出来。 在本文中&#xff0c;我们通过…...

手机复制链接提取视频的软件/seo研究协会网app

背景 有这样一个需求&#xff0c;一位 React Suite&#xff08;以下简称 rsuite&#xff09;的用户&#xff0c;他需要一个 Table 组件能够像 Jira Portfolio 一样&#xff0c;支持树形数据&#xff0c;同时需要支持大数据渲染。 截止到目前&#xff08;2019年1月17日&#xff…...

医疗手机网站建设/惠州百度关键词优化

服务端效果图&#xff1a; 在发布端用定时器模拟数据上传给服务端。 移动端效果图&#xff1a; 变化的数字是从发布端上传到服务端&#xff0c;再推送到移动端。 1. nodejs 安装MQTT服务 1.1 安装 mqtt 服务器必要依赖项 mosca mqtt npm install mosca mqtt --save1.2 在项…...