【MySQL】数据库——主从复制和读写分离

一、MySQL读写分离

1.概念:

读写分离,基本的原理是让主数据库处理事务性增、改、删操作(insert、update、delete),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

2.为什么要读写分离呢?

因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。
但是数据库的“读”(
读10000条数据可能只要5秒钟)。
所以读写分离,解决的是:数据库的写入,影响了查询的效率。

3.什么时候要读写分离?

数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用。利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能。

4.主从复制与读写分离

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份而mysql主从复制是对数据库中的数据、语句做备份。

二、MySQL主从复制原理

2.1 MySQL复制类型

MySQL的主从复制类型是基于二进制日志类型来实现的。

  1. STATEMENT:基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。但是高并发情况下,会出现SQL语句执行顺序紊乱的错误。
  2. ROW:基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
  3. MIXED:混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

2.2 主从复制工作过程

两个日志(主:binlog二进制日志,从:relay-log中继日志
四个线程(主:dump线程ack collector线程,从:IO线程SQL线程

  1. 主库(master)如果发生数据更新,会将写入操作记录到二进制日志(bin log)里
  2. 从库(slave)探测到主库的二进制日志发生了更新,就会开启IO线程向主库请求二进制日志事件
  3. 主库会为每个从库IO线程的请求开启DUMP线程,并发送二进制日志事件给从库
  4. 从库接收到二进制日志事件后会保存到自己的中继日志(relay log)中
          附:在半同步模式下从库会返回确认信息给主库,主库会用ack收集线程接收从库反馈的确认信息(5.7版本开始支持)
  5. 从库还会开启SQL线程读取中继日志里的事件,并在本地重放(将二进制日志事件解析成sql语句逐一执行),从而实现主库和从库的数据一致

注:

  • 中继日志通常会位于 OS 缓存中,所以中继日志的开销很小。
  • 复制过程有一个很重要的限制,即复制在 Slave上是串行化的,也就是说 Master上的并行更新操作不能在 Slave上并行操作。

2.3 MySQL 读写分离原理

读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性操作,而从数据库处理select查询。数据库复制被用来主数据库上事务性操作导致的变更,同步到集群中的从数据库。

2.4 读写分离的两种实现方式

(1)基于程序代码内部实现

在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。
优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。
但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。

(2)基于中间代理层实现

代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。
(1)MySQL-Proxy。MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行SQL 判断。
(2)Atlas。是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。
(3)Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程
(4)Mycat。是一款流行的基于Java语言编写的数据库中间件,是一个实现了MySql协议的服务器,其核心功能是分库分表。配合数据库的主从模式还可以实现读写分离。

三、实验:实现MySQL主从复制

首先装mysqlLNMP网站架构分布式搭建部署-CSDN博客

1 搭建MySQL主从复制步骤

开启三台虚拟机:
主:192.168.10.16  centos7
从1:192.168.10.18  centos7

从2:192.168.10.19  centos7
服务端: 192.168.10.20 centos7   为主从服务器提供时钟源

初始化操作:

(1)开启同步,看看四台MySQL是否同一版本

###关闭和禁止防火墙开机自启功能和关闭安全模块
systemctl disable --now firewalld.service
setenforce 0
vim /etc/selinux/config
SELINUX=disabled

(2)时间同步

我的四台服务器都为nat模式(但其实只要服务端联网即可),都要开chrony服务用于时间同步,MHA服务端 配置chrony与阿里云时间服务器同步,其他三台数据库服务器server指向服务端ip

[root@localhost ~]# rpm -q ntp
ntp-4.2.6p5-29.el7.centos.2.x86_64
[root@localhost ~]# rpm -qa chrony
chrony-3.4-1.el7.x86_64
[root@localhost ~]# systemctl start chronyd   #开启chronyd服务
[root@localhost ~]# vim /etc/chrony.conf      #配置chrony
[root@localhost ~]# systemctl restart chronyd #配置完重启服务
[root@localhost ~]# timedatectl               #查看是否时间同步Local time: 三 2024-06-26 20:18:35 CSTUniversal time: 三 2024-06-26 12:18:35 UTCRTC time: 三 2024-06-26 12:18:34Time zone: Asia/Shanghai (CST, +0800)NTP enabled: yes                         #yes
NTP synchronized: yes                         #yesRTC in local TZ: noDST active: n/a
[root@localhost ~]# vim /etc/selinux/config

注释原本官方源,添加本地提供时钟源的IP,

使用timedatectl查看三台服务器时间是否一致

以上方法是可以让数据库服务器不联外网,也可实现时间同步。

第二种方法就是 三台机全部直接server ntp.aliyun.com iburst 全部都和阿里云时间同步。

(3)服务器修改主机名

hostnamectl set-hostname 主机名

(3)主从服务器启动mysql

systemctl start mysqld

(4)设置参数实现通过主机名管理这些主机(四台服务器同时修改,操作一致)

[root@mysql1 ~]# vim /etc/hosts

(5)配置主从服务器(三台同样操作,id要改)

修改/etc/my.cnf文件,开启二进制日志和中继日志

log-bin=mysql-bin
binlog_format=mixed
relay-log=relay-log-bin    
relay-log-index=relay-log-bin.index
log-slave-updates = 1 

 配置完重启服务

systemctl restart mysqld

(6)主从服务器创建mysql和mysqlbinlog的软链接(三台同样操作)

ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqladmin /usr/sbin/

(7)主从服务器创建并授权数据库主从复制和MHA用户

主服务器(192.168.10.16)

mysql -u root -pabc123
create user 'myslave'@'192.168.10.%' identified by 'myslave123'; #创建用户
grant replication slave on *.* to 'myslave'@'192.168.10.%';      #给权限create user 'manger'@'192.168.10.%' identified by 'manger123';    #MHA用户
grant all on *.* to 'manger'@'192.168.10.%';   #如果单纯做主从复制可忽略这两行flush privileges;       #刷新
show master status;  #用于显示主服务器的状态信息,返回主服务器的二进制日志文件名和位置

从服务器(192.168.10.18)(192.168.10.19)

mysql -u root -pabc123
create user 'myslave'@'192.168.10.%' identified by 'myslave123';
grant replication slave on *.* to 'myslave'@'192.168.10.%';
create user 'manger'@'192.168.10.%' identified by 'manger123';
grant all on *.* to 'manger'@'192.168.10.%';
flush privileges;
change master to master_host='192.168.10.16', master_port=3306, master_user='myslave', master_password='myslave123', master_log_file='mysql-bin.000001', master_log_pos=1910; ##file和pos值为主服务器查询的值
start slave;  
show slave status\G   #检查状态
set global read_only=1;   #设置为只读

8)验证: 

主服务器进程创建库、表,并插入数据 

———————————————————————主服务器——————————————————
mysql> create database cywl;  //创建库
Query OK, 1 row affected (0.00 sec)mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| cywl               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)mysql> use cywl;
Database changed
mysql> create table xy101 (id int, name varchar(20));  //创建表
Query OK, 0 rows affected (0.00 sec)mysql> insert into xy101 values (1, 'yuan');  //插入数据
Query OK, 1 row affected (0.01 sec)mysql> insert into xy101 values (2, 'zhi');
Query OK, 1 row affected (0.00 sec)mysql> select * from xy101;
+------+------+
| id   | name |
+------+------+
|    1 | yuan |
|    2 | zhi  |
+------+------+
2 rows in set (0.00 sec)mysql> 
——————————————————从服务器查看验证——————————————————
mysql> select * from cywl.xy101;
+------+------+
| id   | name |
+------+------+
|    1 | yuan |
|    2 | zhi  |
+------+------+
2 rows in set (0.00 sec)mysql> 

实验:搭建半同步模式

半同步复制 :  主库在执行完客户端提交的事务后,只要等待一个从库返回响应给主库,才会响应给客户端

 此实验基于以上主从复制实验结果为基础

三台虚拟机:一主(1)190.168.10.16,两从(2,3)192.168.10.18,192.168.10.19

 主服务器:

(1)添加半同步模式参数,并重启mysql服务;

vim /etc/my.cnf
###添加半同步模式的参数
plugin-load=rpl_semi_sync_master=semisync_master.so	   #加载mysql半同步复制的插件
rpl_semi_sync_master_enabled=ON		  #或者设置为"1",即开启半同步复制功能				
rpl-semi-sync-master-timeout=1000     #超时时间为1000ms,即1ssystemctl restart mysqld					

vim /etc/my.cnf
————————————————————————————————————————————————————————————————
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=ON
rpl-semi-sync-master-timeout=1000
————————————————————————————————————————————————————————————————
systemctl restart mysqld

[root@l1 ~]# systemctl restart mysqld.service 
从服务器(两个服务器配置一致):

从服务器二号机 

vim /etc/my.cnf————————————插入————————————————————————————————
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=ON
————————————————————————————————————————————————systemctl restart mysqld

从服务器三号机和二号机操作一样 

 主服务器查看:
mysql  -u root -pabc123;
show status like '%Rpl_semi%';	 #在主库查询半同步状态

​​​​​​​ 

参考说明: 

 
Rpl_semi_sync_master_clients              		#半同步复制客户端的个数
Rpl_semi_sync_master_net_avg_wait_time    		#平均等待时间(默认毫秒)
Rpl_semi_sync_master_net_wait_time        		#总共等待时间
Rpl_semi_sync_master_net_waits            		#等待次数
Rpl_semi_sync_master_no_times             		#关闭半同步复制的次数
Rpl_semi_sync_master_no_tx                		#表示没有成功接收slave提交的次数
Rpl_semi_sync_master_status               		#表示当前是异步模式还是半同步模式,on为半同步
Rpl_semi_sync_master_timefunc_failures    		#调用时间函数失败的次数
Rpl_semi_sync_master_tx_avg_wait_time     		#事物的平均传输时间
Rpl_semi_sync_master_tx_wait_time         		#事物的总共传输时间
Rpl_semi_sync_master_tx_waits             		#事物等待次数
Rpl_semi_sync_master_wait_pos_backtraverse		#可以理解为"后来的先到了,而先来的还没有到的次数"
Rpl_semi_sync_master_wait_sessions        		#当前有多少个session因为slave的回复而造成等待
Rpl_semi_sync_master_yes_tx               		#成功接受到slave事物回复的次数

​​​​​​​实验:搭建MySQL读写分离:

centos7-2(192.168.9.210)与centos7-5(192.168.9.120)

二号机(192.168.10.18),三号机(192.168.10.19)做从服务器;

centos7-8(192.168.9.150)

一号机(192.168.10.16)做主服务器;

centos7-7(192.168.9.140)

四号机(192.168.10.20)Amoeba服务器

 该“案例实施:搭建MySQL读写分离”,是在“案例实施:搭建MySQL主从复制”的基础上进行的,因此此处省略MySQL主从复制的步骤

Amoeba服务器:

1.初始化操作
[root@l4 ~]# systemctl disable --now firewalld.service 
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@l4 ~]# setenforce 0
[root@l4 ~]# vim /etc/selinux/config 
[root@l4 ~]# 

​​​​​​​

[root@l4 ~]# mount /dev/sr0 /mnt
mount: /dev/sr0 写保护,将以只读方式挂载
[root@l4 ~]# df
文件系统                   1K-块    已用     可用 已用% 挂载点
devtmpfs                  914412       0   914412    0% /dev
tmpfs                     931496       0   931496    0% /dev/shm
tmpfs                     931496   10448   921048    2% /run
tmpfs                     931496       0   931496    0% /sys/fs/cgroup
/dev/mapper/centos-root 38770180 4576740 34193440   12% /
/dev/sda1                1038336  191104   847232   19% /boot
tmpfs                     186300      12   186288    1% /run/user/42
tmpfs                     186300       0   186300    0% /run/user/0
/dev/sr0                 4635056 4635056        0  100% /mnt
[root@l4 ~]# 

2.安装 Java 环境

rpm -qa | grep jdk
yum remove java*   
#因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。

[root@l4 ~]# cd /opt/
[root@l4 opt]# ls      #传入amoeba包
amoeba-mysql-binary-2.2.0.tar.gz  jdk-6u14-linux-x64.bin  rhchmod +x jdk-6u14-linux-x64.bin./jdk-6u14-linux-x64.bin
//按yes,按entermv jdk1.6.0_14/ /usr/local
lsmkdir /usr/local/amoebatar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
cd /usr/local

vim /etc/profile.d/jdk1.6.sh
export JAVA_HOME=/usr/local/jdk1.6.0_14
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$AMOEBA_HOME/bin
#添加配置
source /etc/profile
java -version
cd /usr/local/amoeba/bin
./amoeba  #如显示amoeba start|stop说明安装成功

cd /usr/local/amoeba/conf/
cp amoeba.xml{,.bak}  #修改前先进行备份
vim amoeba.xml  #修改amoeba配置文件<property name="user">lin</property> ##30行修改用户名<property name="password">lin123</property>  ##32行修改密码
##115行默认服务器连接到master组      #该用户名及密码为客户端连接amoeba的用户名及密码
<property name="defaultPool">master</property>
##117行去掉注释并修改
<property name="writePool">master</property>
<property name="readPool">slaves</property>
cd /usr/local/amoeba/conf/
cp amoeba.xml{,.bak}vim amoeba.xml

主从服务器创建用户

主服务器:

mysql -uroot -pabc123create user 'amoeba'@'192.168.18.%' identified by 'amoeba123';grant all on *.* to 'amoeba'@'192.168.18.%';

两个从服务器

mysql -uroot -pabc123grant all on *.* to 'amoeba'@'192.168.18.%' identified by 'amoeba123';

Amoeba服务器

cd /usr/local/amoeba/conf/
cp dbServers.xml{,.bak}
vim dbServers.xml
注释23行
##设置为amoeba用户
<property name="user">amoeba</property> 
##删除30行注释,28行注释添加完整,29行密码修改
<property name="password">amoeba123</property>
##44行47行分别设置主服务器名字和地址              ##此处用户名和密码为amoeba与主从服务器连接用
<dbServer name="master"  parent="abstractServer">
<property name="ipAddress">192.168.9.150</property>
##51行54行分别设置从服务器名字和地址
<dbServer name="slave1"  parent="abstractServer">
<property name="ipAddress">192.168.9.210</property>
##56行下额外添加一个从服务器配置<dbServer name="slave2"  parent="abstractServer"><factoryConfig><!-- mysql ip --><property name="ipAddress">192.168.9.120</property></factoryConfig></dbServer>
##64行设置服务器池名称
<dbServer name="slaves" virtual="true">
##70行定义两个服务器地址
<property name="poolNames">slave1,slave2</property>
cd /usr/local/amoeba/conf/cp dbServers.xml{,.bak}vim dbServers.xml

cd /usr/local/amoeba/bin./amoeba start &    //后台运行amoebanetstat -lntp | grep 8066

[root@l4 bin]# netstat -lntp | grep 8066
tcp6       0      0 :::8066                 :::*                    LISTEN      66180/java          

测试

使用navicat

关闭从库进行验证

测试1

stop slave;  #关闭两个从库

测试2

当两台从服务器重新开启时

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

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

相关文章

每日复盘-20240702

今日关注&#xff1a; 20240702 六日涨幅最大: ------1--------301388--------- 欣灵电气 五日涨幅最大: ------1--------301388--------- 欣灵电气 四日涨幅最大: ------1--------301388--------- 欣灵电气 三日涨幅最大: ------1--------301388--------- 欣灵电气 二日涨幅最…

OpenSSH RCE (CVE-2024-6387) | 附poc | 小试

Ⅰ 漏洞描述 OpenSSH 远程代码执行漏洞(CVE-2024-6387)&#xff0c;该漏洞是由于OpenSSH服务器 (sshd) 中的信号处理程序竞争问题&#xff0c;未经身份验证的攻击者可以利用此漏洞在Linux系统上以root身份执行任意代码。 Ⅱ 影响范围 8.5p1 < OpenSSH < 9.8p1 但OpenSS…

Java--创建对象内存分析

1.如图所示&#xff0c;左边为一个主程序&#xff0c;拥有main方法&#xff0c;右边定义了一个Pet类&#xff0c;通过debug不难看出&#xff0c;当启动该方法时&#xff0c;有以下该步骤 1.运行左边的实例化Pet类对象 2.跳转至右边定义Pet类的语句 3.跳回至左边获取Pet类基本属…

PyInstaller exe文件报错

文章目录 包找不到的问题去掉黑窗口 包找不到的问题 遇到的问题 : 打包好了之后exe文件报错: 没有找到这个文件 1.当时打包的 有这个文件main.spec 打开它找到hiddenimports ,填上差的包 2, 删除build和dist 3,在当前命令行下执行pyinstaller main.spec打包生成exe 去掉黑…

3.js - 深度测试、深度写入、深度函数

md&#xff0c;艹&#xff0c;这玩意得理解&#xff0c;只看代码不管事 效果图 代码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } …

入门PHP就来我这(纯干货)05

~~~~ 有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 ~~~~ 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 1 数组及创建 数组&#xff0c;顾名思义&#xff0c;本质上就是一系列数据的组合…

Studying-代码随想录训练营day26| 491.递增子序列、46.全排列、47.全排列 II、51.N皇后、37.解数独、回溯总结

第26天&#xff0c;回溯part04&#xff0c;昨天休息复习总结回溯内容&#xff0c;&#x1f4aa;(ง •_•)ง&#x1f4aa; 目录 491.递增子序列 46.全排列 47.全排列 II 51.N皇后 37.解数独 回溯总结 491.递增子序列 文档讲解&#xff1a;代码随想录递增子序列 视频讲…

[数据库原理]数据库设计(er图)

xtu期末是机试&#xff0c;所以图形表示有点不同 实体之间的关系&#xff1a; 多对多&#xff1a;可以生成一个新的关系模型一对一&#xff1a;两边都要关联一对多、多对一 &#xff1a;一的主键可以作为多的外键 如有错误&#xff0c;欢迎指正&#xff01;&#xff01;&#x…

中画幅巡检相机-SHARE 100M A10

【毫厘之间&#xff0c;洞见非凡】 ——SHARE 100M A10中画幅测量相机&#xff0c;巡检行业的新选择 在巡检行业&#xff0c;精准度是关键&#xff0c;深圳赛尔智控科技有限公司最新推出的SHARE 100M A10中画幅测量相机&#xff0c;基于先进的IMX461影像传感器&#xff0c;拥有…

rmvb转mp4格式有什么好方法?这四种好方法轻松帮你完成转换!

rmvb转mp4格式有什么好方法&#xff1f;当大家深入探索视频格式的多元世界时&#xff0c;不禁会被各种格式的独特魅力所吸引&#xff0c;在众多选项中&#xff0c;RMVB和MP4无疑是两大热门选择&#xff0c;它们各自在不同的场合下展现出了令人瞩目的优势与局限&#xff0c;首先…

25考研:今年初试时间比去年更早了?

过去5年考研初试时间安排如下&#xff1a; 24考研&#xff1a;2023年12月23-24日&#xff08;倒数第二个周末&#xff09; 23考研&#xff1a;2022年12月24-25日&#xff08;倒数第二个周末&#xff09; 22考研&#xff1a;2021年12月25-26日&#xff08;最后一个周末&#xf…

【Linux】TCP协议【下二】{流量控制/滑动窗口/延迟应答/捎带应答/拥塞控制}

文章目录 1.流量控制--利用“窗口大小”字段协商数据量大小1. 1第一次的时候&#xff0c;怎么保证发送数据量是合理的1.2第三次握手ack的时候&#xff0c;可以携带数据&#xff01;1.3流量控制&#xff0c;属于可靠性还是属于效率&#xff1f; 2.滑动窗口--利用滑动窗口解决批量…

快速入门FreeRTOS心得(正点原子学习版)

对于FreeROTS&#xff0c;我第一反应想到的就是通信里的TDM&#xff08;时分多址&#xff09;。不同任务给予分配不同的时间间隔&#xff0c;也就是任务之间在每个timeslot都在来回切换。 这里有重要的一点&#xff0c;就是中断要短小&#xff0c;优先级是自高到底进行打断。 …

Cocos制作抖音小游戏接入侧边栏复访接口实例

本篇文章主要讲解&#xff0c;使用cocos接入抖音小游戏侧边栏接口的实例教程。 日期&#xff1a;2024年7月1日 作者&#xff1a;任聪聪 教程实例&#xff1a;https://download.csdn.net/download/hj960511/89509196 下载后可直接导入运行 上传游戏后抖音预审不通过 注意&#x…

98 - IDEA远程调试服务器Java程序

Java 提供了一套标准的调试协议&#xff08;JDWP - Java Debug Wire Protocol&#xff09;&#xff0c;允许调试器&#xff08;IDE&#xff09;与被调试程序&#xff08;应用&#xff09;之间进行通信。 1.服务器特定命令启动程序 在服务器上以以下命令启动Java程序 java -a…

南京林业大学点云相关团队论文

【1】Chen Dong, Wan Lincheng, Hu Fan, Li Jing, Chen Yanming, Shen Yueqian*, Peethambaran Jiju, 2024. Semantic-aware room-level indoor modeling from point clouds, International Journal of Applied Earth Observation and Geoinformation, 2024, 127, 103685. 语义…

什么是脏读、幻读、不可重复读

数据库事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作&#xff0c;这些操作要么全部成功执行&#xff0c;要么全部失败回滚&#xff0c;以保持数据库的一致性和完整性。在多线程或多用户同时操作时&#xff0c;难免会出现错乱与冲突&#xff0c;这就需要引入事务的…

软考高级-系统分析师知识点100条速记!

宝子们&#xff01;上半年软考已经结束一段时间了&#xff0c;准备备考下半年软考高级-系统分析师的小伙伴可以开始准备了&#xff0c;毕竟高级科目的难度可是不低的&#xff0c;相信参加过上半年系分的小伙伴深有体会。 这里给大家整理了100条系分知识点&#xff0c;涵盖全书9…

面试官:你了解git cherry-pick吗

事情要从一次不规范的代码开发开始说起 背景故事 时间 2024年某个风平浪静的周五晚上 地点 中国&#xff0c;北京&#xff0c;西二旗&#xff0c;某互联网大厂会议室 人物 小杰&#xff0c;小A&#xff0c;小B&#xff0c;老K 对话 老K&#xff1a;昨天提交的代码被测试打回来…

[ROS 系列学习教程] 建模与仿真 - 使用 ros_control 控制差速轮式机器人

ROS 系列学习教程(总目录) 本文目录 一、差速轮式机器人二、差速驱动机器人运动学模型三、对外接口3.1 输入接口3.2 输出接口 四、控制器参数五、配置控制器参数六、编写硬件抽象接口七、控制机器人移动八、源码 ros_control 提供了多种控制器&#xff0c;其中 diff_drive_cont…