MySQL 事务原理

news2024/12/27 13:20:02

文章目录

    • 1、事务
      • 1.1、ACID 特性
        • 1.1.1、原子性
          • undo log
        • 1.1.2、一致性
        • 1.1.3、* 隔离性
        • 1.1.4、持久性
          • redo log
      • 1.2、事务控制语句
    • 2、隔离级别
      • 2.1、隔离级别的分类
        • 2.1.1、读未提交 RU
        • 2.1.2、读已提交 RC
        • 2.1.3、可重复读 RR
        • 2.1.4、串行化 SC
      • 2.2、并发事务读异常
        • 2.2.1、* 脏读
        • 2.2.2、* 不可重复读
        • 2.2.3、* 幻读
        • 2.2.4、测试代码
    • 3、MVCC
      • 3.1、当前读 & 快照读
      • 3.2、Read View
        • 3.2.1、read view 生成
        • 3.2.2、read view 属性
      • 3.3、聚集索引隐藏列
      • 3.4、undo log
      • 3.4、事务的可见性

1、事务

事务 (transaction) :并发的场景下,用户定义的操作序列,这些操作要么都做,要么都不做,不可分割。

目的:将数据库从一种一致性状态转换为另一种一致性状态,保证系统始终处于一个完整且正确的状态。

1.1、ACID 特性

  • 原子性 (Atomicity)
  • 一致性 (Consistency)
  • 隔离性 (Isolation)
  • 持久性 (Durability)

1.1.1、原子性

一个事务中的操作,要么都做,要么都不做,不存在中间状态,是一个不可分割的工作单位。若事务执行过程发生错误,回滚到事务初始状态。

实现机制: undo log

undo log

undo log 回滚日志,存放在共享表空间内,用于存储旧版本的数据。

undo log是逻辑日志,回滚时将数据库逻辑地恢复到原来的样子,也就是说,根据 undo log 记录的事务 DML 操作,做之前的相反操作,实现回滚操作,保证了事务的原子性和一致性。

此外,undo log 也可以用来实现 MVCC。用户读取记录时,若该记录被其他事务占用,当前事务可以通过 undo log 读取之前事务 DML 操作提交后的行版本信息,以此实现非锁定读。

总结 undo log 的作用

  • 事务回滚:记录事务 DML 操作步骤,通过逆运算(逻辑取反)实现事务回滚。
  • MVCC:记录事务 DML 操作提交后产生的行版本信息。

1.1.2、一致性

事务的前后,数据满足完整性约束,数据库保持一致性状态。

一致性指的是事务将数据库从一种一致性状态转变为下一种一致性的状态,在事务执行前后,数据库完整性约束没有被破坏。一个事务需要提交后才会被其他事务可见。

一致性的种类

  • 数据一致性(完整性约束),必须遵守
  • 预期一致性(逻辑一致性),适当破坏。例:查询是否存在,不存在写入,可能出现数据查询不存在,插入时却存在,报错。

实现机制:原子性 + 隔离性 + 一致性实现。

1.1.3、* 隔离性

并发事务间相互隔离,互不影响,避免多个事务并发异步执行进而导致数据的不一致。

实现机制:为了提升性能,设定不同程度的隔离级别,适度破坏逻辑一致性。

  • :用来并发处理 DML 操作。数据库中提供粒度锁的策略,针对表(聚集索引 B+ 树)、页(聚集索引 B+ 树叶子节点)、行(叶子节点中某一段行记录)三种粒度加锁
  • MVCC :多版本并发控制。主要解决一致性非锁读,通过记录和获取行版本,而不是使用锁来限制读操作,从而实现高效并发读性能。

1.1.4、持久性

事务一旦提交,其结果就是永久性的,即使系统故障也不丢失。

实现机制: redo log

redo log

redo log 重做日志,用于实现事务的持久性。

事务提交后,事务 DML 操作持久化,记录事务 DML 操作对应物理页修改的内容,写入 redo log 磁盘文件。发生宕机等故障时,恢复数据库数据。

redo log 属于 WAL (Write Ahead Log)预写日志,用于数据恢复,顺序写磁盘,再通过其他线程异步刷到 B+ 树。与 redis 的aof类似。

1.2、事务控制语句

innoDB 中一条 sql 语句是一个事务。若想多条语句构成事务,采用事务控制语句。

-- 显示开启事务
START | BEGIN TRANSACTION
-- 提交事务,并使得已对数据库做的所有修改持久化
COMMIT
-- 回滚事务,结束用户的事务,并撤销正在进行的所有未提交的修改
ROLLBACK
-- 创建一个保存点,一个事务可以有多个保存点
SAVEPOINT identifier
-- 删除一个保存点
RELEASE SAVEPOINT identifier
-- 事务回滚到保存点
ROLLBACK TO [SAVEPOINT] identifier

2、隔离级别

ISO 和 ANIS SQL 标准制定了四种事务隔离级别,目的在于提升数据库并发性能。

不同隔离级别的区别在于读操作的加锁,写操作均加排他锁。隔离级别的高低,与事务请求锁的数量和保持锁时间的长短相关。级别越高,性能越低;级别越低,逻辑一致性受到的影响越大。

2.1、隔离级别的分类

  • 读未提交:事务还未提交,其变更就能被其他事务看到
  • 读已提交:事务提交后,其变更才能被其他事务看到
  • 可重复读:事务执行过程中看到的数据,一直跟与该事务启动时看到的数据是一致的
  • 串行化:对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;

2.1.1、读未提交 RU

读未提交,READ UNCOMMITTED。事务还未提交,其修改就能被其他事务看到。

  • 读:不做处理
  • 写:自动加 X 锁

逻辑错误:脏读。

2.1.2、读已提交 RC

读已提交,READ COMMITTED。事务提交后,其他事务才能看到修改。大部分数据库采用的隔离级别,如 oracle, SQL Server 等。

  • 读:MVCC,读取最新版本的行数据
  • 写:自动加 X 锁

MVCC 在事务期间每次读取数据时,生成新的 read view,这也意味着同一事务多次读取同一条数据可能出现数据不一致(不可重复读)。因为在多次读取数据期间可能有其他事务修改并提交了该条记录。

逻辑错误:不可重复读。

2.1.3、可重复读 RR

可重复读 (RR) ,REPEATABLE READ,事务执行过程中看到的数据,一直跟与该事务启动时看到的数据是一致的。MySQL InnoDB 引擎的默认隔离级别。

  • 读:MVCC,读取事务开始前版本的行数据
  • 写:自动加 X 锁

MVCC 在事务启动时,生成新的 read view,整个事务期间读取数据使用这个 read view,这样保证了在事务期间读到的数据都是事务启动前的记录。

逻辑错误:幻读。

2.1.4、串行化 SC

串行化,SERIALIZABLE,对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

  • 读:自动加 S 锁 (next-key locking)
  • 写:自动加 X 锁

2.2、并发事务读异常

不同隔离级别由于逻辑一致性问题造成的并发异常。

  • 脏读:读到其他事务未提交的数据。
  • 不可重复读:前后读取的数据不一致。UPDATE
  • 幻读:前后读取的记录数量不一致。INSERT DELETE

2.2.1、* 脏读

一个事务读到了另一个事务未提交的修改(读到脏数据)。

不可重复读在 RU 隔离级别存在。在读写分离的场景下,可以将 slave 节点设置为 READ UNCOMMITTED。此时脏读不影响,在 slave 上查询并不需要特别精准的返回值。

例如:session B 读到了 session A 中事务未提交的脏数据。

seqsession Asession B
1SET @@tx_isolation = ‘READ UNCOMMITTED’;SET @@tx_isolation = ‘READ UNCOMMITTED’;
2BEGIN;BEGIN;
4UPDATE account_t SET money = money - 100 WHERE name = ‘A’;
5SELECT money FROM account_t WHERE name = ‘A’;
6COMMIT;COMMIT;

2.2.2、* 不可重复读

同一事务内两次读取同一个数据前后不一样。一个事务读到了另一个事务的提交的修改

不可重复读在 RC 隔离级别存在。一般来说,不可重复读的问题可以接受,因为读到已经提交的数据,不会带来很大的问题。

例如:session B 读到了 session A 中事务提交的修改,造成两次读取同一个数据不一样。

seqsession Asession B
1SET @@tx_isolation = ‘READ COMMITTED’;SET @@tx_isolation = ‘READ COMMITTED’;
2BEGIN;BEGIN;
4SELECT money FROM account_t WHERE name = ‘A’;
5UPDATE account_t SET money = money - 100 WHERE name = ‘A’;
6COMMIT ;SELECT money FROM account_t WHERE name = ‘A’;
7COMMIT;

2.2.3、* 幻读

同一事务两次读取同一个范围内的记录得到的结果集不一样。

幻读在 RR 隔离级别存在,仅在当前读下出现。

例如:由于 session A 的事务提交了插入操作,导致 session B 两次查询范围的结果不一样。

seqsession Asession B
1SET @@tx_isolation = ‘REPEATABLE READ’;SET @@tx_isolation = ‘REPEATABLE READ’;
2BEGIN;BEGIN;
4SELECT * FROM account_t WHERE id >= 2;
5INSERT INTO account_t VALUES (4, ‘D’, 1000);
6COMMIT ;
7SELECT * FROM account_t WHERE id >= 2;
COMMIT;

解决:通过读加锁(next-key locking)

seqsession Asession B
1SET @@tx_isolation = ‘REPEATABLE READ’;SET @@tx_isolation = ‘REPEATABLE READ’;
2BEGIN;BEGIN;
4SELECT * FROM account_t WHERE id >= 2 FOR UPDATE | IN SHARE MODE;
INSERT INTO account_t VALUES (4, ‘D’, 1000);
6COMMIT ;
7SELECT * FROM account_t WHERE id >= 2;
COMMIT;

MySQL InnoDB 引擎的默认隔离级别是可重复读,但是它可以很大程度上避免幻读现象。

  • 针对快照读:通过 MVCC 方式解决了幻读。因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好了避免幻读问题。
  • 针对当前读:是通过 next-key lock(记录锁+间隙锁)方式解决了幻读。因为当执行 select … for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题。

2.2.4、测试代码

DROP TABLE IF EXISTS `account_t`;
CREATE TABLE `account_t` (
	`id` INT(11) NOT NULL,
	`name` VARCHAR(225) DEFAULT NULL,
	`money` INT(11) DEFAULT 0,
	PRIMARY KEY(`id`),
	KEY `idx_name` (`name`)
) ENGINE = innoDB AUTO_INCREMENT=0 DEFAULT CHARSET = utf8;

SELECT * FROM `account_t`;

INSERT INTO `account_t` VALUES (1, 'A', 1000), (2, 'B', 1000), (3, 'B', 1000);

ROLLBACK;

-- 脏读:一个事务读取了另一个未提交事务的修改
-- 隔离级别:READ UNCOMMITTED
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN
-- 脏读事务1
UPDATE `account_t` SET `money` = `money` - 100 WHERE `name` = 'A';
-- 脏读事务2
SELECT `money` FROM `account_t` WHERE `name` = 'A';
COMMIT;

-- 不可重复读:一个事务内两次读取同一个数据不一样
-- 隔离级别:READ COMMITTED,解决了脏读问题
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN
-- 不可重复读事务1
UPDATE `account_t` SET `money` = `money` - 100 WHERE `name` = 'A';
-- 不可重复读事务2
SELECT `money` FROM `account_t` WHERE `name` = 'A';
COMMIT;

-- 幻读:一个事务内两次读取同一个范围内的记录得到的结果集不一样。
-- 隔离级别:REPEATABLE READ,解决了不可重复读
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN
-- 幻读事务1
INSERT INTO `account_t` VALUES (4, 'D', 1000);
-- 幻读事务2
SELECT * FROM `account_t` WHERE `id` >= 2;
-- 幻读事务2:解决幻读问题
SELECT * FROM `account_t` WHERE `id` >= 2 FOR UPDATE;
COMMIT;

3、MVCC

多版本并发控制 MVCC(Multiversion Concurrency Control),用来实现一致性的非锁定读。非锁定读是指不需要等待访问记录 X 锁的释放。因此 MVCC 没有读写阻塞,只有写写阻塞,提高了并发性。

MVCC 只在读已提交和可重复读的隔离级别下工作,与其他隔离级别不兼容。

MVCC 通过 read view,聚集索引隐藏列,undo log 来实现,关键是解决事务的可见性问题。

3.1、当前读 & 快照读

innoDB 支持的读方式

  • 当前读(锁定读):读取最新版本的记录,对读取的记录加锁(悲观锁),保证其他并发事务不能修改当前记录。
    • select ... lock in share mode | for update
    • insert, delete, update,不管什么隔离级别,DML 操作均加锁。
    • undo log
  • 快照读(非锁定读):读取记录的一个快照,对读取的记录不加锁。普通 SELECT 语句

MVCC 的读指的是快照读(非锁定读),因为没有事务需要对历史数据进行 DML 操作。

在读已提交和可重复读的隔离级别下,对于快照数据的定义不同

  • RC 级别:读取当前事务锁定行的最新行记录。
  • RR 级别:读取启动事务时的行记录版本。

3.2、Read View

read view 是事务进行快照读的时候产生的读视图,保存了当前事务开启时所有活跃事务的列表。

3.2.1、read view 生成

在读已提交和可重复读的隔离级别下,read view 的区别仅在于创建 read view 的时机不同:

  • RC 级别:每次读取数据时,生成新的 read view。
  • RR 级别:启动事务时,生成新的 read view,一直使用到事务提交。

3.2.2、read view 属性

  • m_ids:创建 read view 时,活跃事务的事务 id 列表。活跃事务指的是已启动但是未提交的事务。
  • min_trx_id:创建 read view 时,活跃事务的最小事务 id
  • max_trx_id:创建 read view 时,预分配给下一个未开启事务的 id,即全局事务的最大事务 id + 1
  • creator_trx_id:创建该 read view 的事务的事务 id

创建 read view 时,read view 属性与事务状态(已提交 - 启动未提交 - 未启动)的关系

在这里插入图片描述

3.3、聚集索引隐藏列

聚集索引记录的隐藏列

  • trx_id:事务修改记录时,trx_id 记录生成该版本的事务 id。
  • roll_pointer:事务修改记录时,将旧记录写入 undo log,roll_pointer 指向旧版本记录,通过它可以找到修改前的记录。

在这里插入图片描述

3.4、undo log

用户读取记录时,若该记录被其他事务占用,当前事务可以通过 undo 读取之前事务 DML 操作提交后的行版本信息,以此实现非锁定读。

innoDB 通过 undo log 保存每个记录的多个版本,每个事务读到的记录版本可能是不一样的。在同一个事务中,用户只能看到该事务创建快照之前已经提交的修改和该事务本身做的修改。

3.4、事务的可见性

事务的可见性问题:当前事务访问某条记录时该记录是否可见

判断规则是:判断生成该版本的事务 id (trx_id)与生成 read view 的当前事务 id 的关系。具体来说,生成 read view 的当前事务处于启动未提交状态,重点判断生成该版本事务的所处状态。

  • trx_id = creator_trx_id:当前事务访问自己修改的记录,该版本记录对当前事务可见。
  • trx_id < min_trx_id:生成该版本的事务在当前事务生成 read view 前已提交,该版本记录对当前事务可见。
  • trx_id > max_trx_id:生成该版本的事务在当前事务生成 read view 后启动,该版本记录对当前事务不可见。
  • min_trx <= trx_id <= max_trx_id,判断生成该版本的事务 id 是否在启动未提交的事务 id 列表中
    • 存在:生成该版本记录的事务已启动但未提交,该版本记录对当前事务不可见
    • 不在:生成该版本记录的事务已提交,该版本记录对当前事务可见

整理一下,方便记忆:

  • trx_id = creator_trx_id,版本事务 = 当前事务
  • trx_id < min_trx_id:版本事务已提交,可见。
  • trx_id > max_trx_id: 版本事务后启动,不可见。
  • min_trx <= trx_id <= max_trx_id,版本事务 id 是否在启动未提交的事务 id 列表中
    • 存在:版本事务启动未提交,不可见
    • 不在:版本事务已提交,可见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PID控制算法基础介绍

PID控制的概念 生活中的一些小电器&#xff0c;比如恒温热水器、平衡车&#xff0c;无人机的飞行姿态和飞行速度控制&#xff0c;自动驾驶等等&#xff0c;都有应用到 PID——PID 控制在自动控制原理中是一套比较经典的算法。 为什么需要 PID 控制器呢&#xff1f; 你一定用…

【PyQt】PyQt学习(一)框架介绍+环境搭建

简介 写在最前面的话 在决定学习、使用一个框架之前需要考量如下几点&#xff1a; 框架运行效果&#xff1b;框架应用范围&#xff1b;框架学习成本和迁移成本&#xff1b;实现自己所需功能的开发效率&#xff1b; 只有综合考量如上四个方面&#xff0c;才能更好地选择适合…

突破传统开发模式,亚马逊云科技助力中科院加速推动合成生物学

当数字技术成为整个社会运行的底座&#xff0c;生物科学也能借力云计算从诸多繁琐重复的工作中解放出来&#xff0c;专注于生物设计与创新。来看看亚马逊云科技如何与TIBCAS合作&#xff0c;推动合成生物学的发展。 明确核心需求&#xff0c;选择合作伙伴 TIBCAS选择与亚马逊…

供应商管理软件如何选型 好用的供应商管理软件推荐

供应商管理是采购中的重要环节。对于很多企业来说&#xff0c;做好内部供应商管理就能在行业竞争中提升自身的效益与竞争能力&#xff0c;供应商已成为一种战略筹码。 但在企业进行供应商管理过程中&#xff0c;往往会遇到供应商信息数据收集不全、等级划分不合理、绩效评价机…

普通应用访问隐藏API的解决办法

众所周知,在Android9之后,Android系统限制了通过反射的方式访问隐藏Api,这对于系统应用来说或者你拥有系统签名的应用来说,并不是一件难事,但是更多的时候,我们的应用并不是系统应用,而现在通过反射的方式调用也会提示出错,那么这种情况下我们是否还有其他方法能够访问…

kettle利用excel文件增量同步一个库的数据(多表一次增量同步)

利用excel文件增量同步一个库的数据 现在有sqlserver和mysql两个库上的表在进行同步&#xff0c;mysql上的是源表&#xff0c;sqlserver上是目标表。 mysql : sqlserver : 可以看到sqlserver上表的最近一次同步日期分别是 pep表&#xff1a; 2022-10-23 14:19:00.000 stu_…

企业实施CMMI中 常见的4大问题

1. CMMI模型的理解和应用不够深入 CMMI模型是一个复杂的模型&#xff0c;它涉及到许多不同的方面&#xff0c;如组织结构、流程、技术、管理等&#xff0c;因此&#xff0c;要想深入理解和应用CMMI模型&#xff0c;需要花费大量的时间和精力。 企业实施CMMI常见4大问题&#xf…

likeshop单商户SaaS商城系统—无限多开,搭建多个商城

likeshop单商户SaaS商城系统&#xff1a;适用于多开&#xff08;SaaS&#xff09;、B2C、单商户、自营商城场景&#xff0c;完美契合私域流量变现闭环交易使用&#xff0c;系统拥有丰富的营销玩法&#xff0c;强大的分销能力&#xff0c;支持DIY多模板&#xff0c;前后端分离。…

阿里云服务器使用

服务器配置CPU&内存&#xff1a;2核(vCPU)2 GiB操作系统&#xff1a;Ubuntu 22.04 64位运行环境部署因为部署用到了nodejs首先&#xff0c;打开终端&#xff0c;并输入以下命令以安装必要的软件包&#xff1a;sudo apt-get install curl接着&#xff0c;使用 curl 命令安装…

RoFormer: Enhanced Transformer with Rotary Position Embedding论文解读

RoFormer: Enhanced Transformer with Rotary Position Embedding 论文&#xff1a;RoFormer: Enhanced Transformer with Rotary Position Embedding (arxiv.org) 代码&#xff1a;ZhuiyiTechnology/roformer: Rotary Transformer (github.com) 期刊/会议&#xff1a;未发表…

计算机网络原理--传输层协议(TCP协议十大特性)

目录 1.认识TCP协议 TCP的协议段格式 2. 确认应答机制 3.超时重传 4.连接管理 <

Spring的事务传播机制

多个事务方法相互调用时&#xff0c;事务如何在这些方法之间进行传播&#xff0c;Spring中提供了七种不同的传播机制&#xff0c;来保证事务的正常执行&#xff1a; REQUIRED&#xff1a;默认的传播机制&#xff0c;如果存在事务&#xff0c;则支持/加入当前事务&#xff0c;如…

大数据技术架构(组件)35——Spark:Spark Streaming(1)

2.3、Spark Streaming2.3.0、OverviewSpark Streaming 是核心 Spark API 的扩展&#xff0c;它支持实时数据流的可扩展、高吞吐量、容错流处理。数据可以从许多来源&#xff08;如 Kafka、Kinesis 或 TCP 套接字&#xff09;获取&#xff0c;并且可以使用复杂的算法进行处理&am…

jieba+wordcloud 词云分析 202302 QCon 议题 TOP 关键词

效果图 步骤 &#xff08;1&#xff09;依赖 python 库 pip install jieba wordcloud数据 概览 $ head -n 5 input.txt 中国软件技术发展洞察和趋势预测报告 2023 QCon 大会内容策划思路 FinOps&#xff1a;从概念到落地 开源芯片的发展现状、机遇和未来 乐观者前行&#xff0…

Axure 9 实战案例,动态面板的应用 4.1,省市区三级联动下拉菜单(重制简易版)

前言 Hello&#xff01;欢迎来到Axure 9 实战案例教程专栏。 本次课程我们继续来学习一下&#xff0c;动态面板的应用。本篇我们来讲解一下&#xff0c;如何绘制省市区联动下拉菜单&#xff08;重新撰写简易版&#xff09;。 下拉菜单初稿为了节省时间&#xff0c;这里提前把…

vue实现打印浏览器页面功能(两种方法)

推荐使用方法二 方法一&#xff1a;通过npm 安装插件 1&#xff0c;安装 npm install vue-print-nb --save 2&#xff0c;引入 安装好以后在main.js文件中引入 import Print from vue-print-nbVue.use(Print); //注册 3&#xff0c;现在就可以使用了 div id"printTest…

ChatGPT爆火,释放了什么不寻常信号?

ChatGPT&#xff0c;真的火了&#xff01; 相信许多朋友都听说过 ChatGPT&#xff0c;但并不清楚它是个啥。 体制内让ChatGPT写材料&#xff0c;广告行业让ChatGPT写策划案&#xff0c;媒体让ChatGPT写新闻稿&#xff0c;程序员让ChatGPT写代码甚至还带修BUG服务。 可以说是“…

告诉ChatGPT,我想读博了!

告诉ChatGPT&#xff0c;我想读博了&#xff01; 上篇文章详细写了如何体验ChatGPT。在实际使用中发现它对固定模板式的文字工作做的比较好。于是我瞬间想起了毕业前被论文支配的恐惧&#xff0c;我突然有一个大胆的想法&#xff0c;那么ChatGPT是否能帮我写一篇毕业论文呢&am…

【求解器-COPT】COPT的版本更新中,老版本不能覆盖的问题

【求解器-COPT】COPT的版本更新中&#xff0c;老版本不能覆盖的问题方法1方法2如果license还是找不到作者&#xff1a;刘兴禄 参考网址&#xff1a; COPT的下载和配置步骤如下&#xff1a; 教程 | Windows系统下如何安装COPT求解器并配置许可文件&#xff1a; https://zhuan…

山洪灾害监测预警平台 山洪灾害监测预警系统解决方案 以人为本 科学防御

平升电子山洪灾害监测预警平台 山洪灾害监测预警系统解决方案&#xff0c;集信息采集、传输、分析和预警等功能于一体&#xff0c;实现预警信息及时、准确地上传下达&#xff0c;提升监测预警能力&#xff0c;使可能受灾区域能够及时采取措施&#xff0c;最大程度减少人员伤亡和…