MySQL的并发控制、事务、日志

目录

一.并发控制

1.锁机制

2.加锁与释放锁

二.事务(transactions)

1.事物的概念

2.ACID特性

3.事务隔离级别

三.日志

1.事务日志

2.错误日志

3.通用日志

4.慢查询日志

5.二进制日志 备份


一.并发控制

在 MySQL 中,并发控制是确保多个用户同时访问数据库时数据一致性和完整性的重要机制。

1.锁机制

锁类型

读锁:共享锁,也称为 S 锁,只读不可写(包括当前事务) ,多个读互不阻塞 只能读 不能写 别人也能看

写锁:独占锁,排它锁,也称为 X 锁,写锁会阻塞其它事务(不包括当前事务)的读和写 写锁 别人看都看不了

锁特征:S 锁和 S 锁是兼容的,X 锁和其它锁都不兼容,举个例子,事务 T1 获取了一个行 r1 的 S 锁,另外事务 T2 可以立即获得行 r1 的 S 锁,此时 T1 和 T2 共同获得行 r1 的 S 锁,此种情况称为锁兼容,但是另外一个事务 T2 此时如果想获得行 r1 的 X 锁,则必须等待 T1 对行 r1 锁的释放,此种情况也称为锁冲突

锁粒度

表锁:最基本的锁机制,对整个表进行锁定,其他会话无法同时修改整个表。

行级锁:允许不同会话同时修改表中的不同行,提高并发性能。MySQL 支持的行级锁包括读取锁(Shared Lock)和写入锁(Exclusive Lock)。

实现

存储引擎:自行实现其锁策略和锁粒度

服务器级:实现了锁,表级锁,用户可显式请求

分类:

隐式锁:由存储引擎自动施加锁

显式锁:用户手动请求

锁策略:在锁粒度及数据安全性寻求的平衡机制

当开启锁时在两个终端同时发送一个命令时只有一台能够实现成功

update students set teacherid=1 where stuid=1;

2.加锁与释放锁

lock  tables  表名  read; #加读锁
lock  tables  表名  write; #加写锁
unlock  tables; #释放锁
flush  tables  with  read lock; #整个数据库加锁

二.事务(transactions)

1.事物的概念

事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。

事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。

事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。

事务通过事务的整体性以保证数据的一致性。

事务能够提高在向表中更新和插入信息期间的可靠性。

2.ACID特性

A:atomicity 原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚

C:consistency一致性;数据库总是从一个一致性状态转换为另一个一致性状态,类似于质量守恒定律(A1wB 0 A1w 给 B转1w 始终保持A+B=1w)

I: Isolation隔离性;一个事务所做出的操作在提交之前,是不能为其它事务所见;隔离有多种隔离级别,实现并发.(不最后提交看不到,脏数

D:durability持久性;一旦事务提交,其所做的修改会永久保存于数据库中

事务结构视图:

begin  #开启事务
set autocommit=0/1  #是否自动提交事务  退出后要再加commit或者rollback
commit 保存退出   rollback  回滚

示例:

(1)将自动提交事务关闭,当执行增删改查操作时需要输入commit或者rollback保存事务

关闭自动提交事务

select @@autocommit;   # 查看自动提交事务变量是否开启
set autocommit=0;      # 关闭自动提交事务  1 为开启

使用insert命令给teachers表中增加一个数据,先不使用commit命令在另一个终端查看

insert  teachers  values(5,'cxk',32,'M');
select * from teachers;

使用commit命令保存后查看

(2)当事务自动提交关闭时,删除teachers表中所有数据,没有使用commit提交,使用rollback回滚,查看表中数据,依然还存在

delete from teachers;
select * from teachers;
rollback;  #回滚      create  drop alter  这些撤回不了
select * from teachers;

数据库事务死锁是指两个或多个事务在执行过程中因互相持有对方所需的资源而无法继续执行的情况。这种情况会导致数据库系统中的事务无法完成,从而影响系统的正常运行。

发生原因

  1. 资源互斥:事务在操作数据库对象(如行、表)时会申请锁,若多个事务同时请求同一资源且彼此互斥,可能导致死锁。

  2. 循环等待:多个事务形成一个循环等待资源的链条,每个事务都在等待下一个事务所持有的资源,从而造成死锁。

具体场景与解决方法

  • 示例场景

    • 事务A:持有资源R1,请求资源R2。
    • 事务B:持有资源R2,请求资源R1。 这种情况下,如果事务A和事务B都不能释放当前持有的资源,它们将无法继续执行下去,造成死锁。
  • 解决方法

    • 超时机制:数据库系统可以设置一个超时时间,当事务持有锁的时间超过设定阈值时,系统可以选择终止其中一个事务,从而打破死锁。
    • 死锁检测与回滚:数据库系统可以周期性地检测是否存在死锁,并在检测到死锁时,选择其中一个事务进行回滚,释放资源,允许其他 [Something went wrong, please try again later.]
BEGIN;
#开启事务
update students set classid=10;
#终端1
update students set classid=20;
#终端2
show engine innodb status;
#在第三个会话中执行

3.事务隔离级别

MySQL 支持四种隔离级别,事务隔离级别从上至下更加严格

1)未提交读( Read Uncommitted(RU))
允许脏读,即允许一个事务可以看到其他事务未提交的修改。

2)提交读(Read Committed(RC))
允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的,防止脏读。

3)可重复读(Repeatable Read(RR))—mysql默认的隔离级别
确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果,不管其他事务是否提交这些修改;

可以防止脏读和不可重复读。

4)串行读(Serializable)—相当于锁表
完全串行化的读,将一个事务与其他事务完全地隔离;

每次读都需要获得表级共享锁,读写相互都会阻塞;

可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率。

隔离级别脏读可重复读幻读加读锁
读未提交可以出现可以出现可以出现
读提交不允许出现可以出现可以出现
可重复读不允许出现不允许出现可以出现
序列化不允许出现不允许出现不允许出现

mysql默认的事务处理级别是 repeatable read ,而Oracle和SQL Server是 read committed 。

MVCC和事务的隔离级别:

MVCC(多版本并发控制机制)只在READ COMMITTED和REPEATABLE READ两个隔离级别下工作。其他两个隔离级别都和MVCC不兼容,因为READ UNCOMMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行。而SERIALIZABLE则会对所有读取的行都加锁

select @@tx_isolation;    #系统隔离级别,是系统自带变量

示例:

(1)可重复读(Repeatable Read(RR))—mysql默认的隔离级别

vim /etc/my.cnf
[mysqld]
transaction-isolation=REPEATABLE-READ终端1
begin;
insert teachers values(null,'cxk',32,'M');
select * from teachers;
commit;终端2
begin;  #需要在终端1增加数据前操作
select * from teachers;
commit;  #提交    最后操作

在终端2,使用commit命令提交前,查看不到teachers表中新增的命令

当终端2使用commit命令提交后,查看teachers表中数据,可以看到增加了tid为7的数据

第一隔离级别 可看见脏读

vim /etc/my.cnf
[mysqld]
transaction-isolation=READ-UNCOMMITTEDsystemctl restart mysqldselect @@tx_isolation;   #查看隔离级别 begin;
#在其中一个终端上插入数据在未提交前,另一终端也可以看见
insert teachers values(6,'c',80,'M');
select * from teachers;

串行化 最严格的隔离级别

vim /etc/my.cnf
[mysqld]
transaction-isolation=SERIALIZABLE
systemctl restart mysqldbegin;
#开启事务两边可以同时读表,会互相锁
select * from teachers;
delete from teachers where tid=5;
#无法删除加锁  并发性较差

三.日志

MySQL 支持丰富的日志类型,如下:

  • 事务日志:transaction log

    事务日志的写入类型为"追加",因此其操作为"顺序IO";通常也被称为:预写式日志 write ahead logging事务日志文件: ib_logfile0, ib_logfile1

  • 错误日志 error log

  • 通用日志 general log

  • 慢查询日志 slow query log

  • 二进制日志 binary log

  • 中继日志 reley log,在主从复制架构中,从服务器用于保存从主服务器的二进制日志中读取的事件

语法:

CREATE PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]])
routime_body 
proc_parameter : [IN|OUT|INOUT] parameter_name type

1.事务日志

事务日志:transaction log

  • redo log:实现 WAL(Write Ahead Log) ,数据更新前先记录redo log

  • undo log:保存与执行的操作相反的操作,用于实现rollback

事务型存储引擎自行管理和使用,建议和数据文件分开存放

Innodb事务日志相关配置:

show variables like '%innodb_log%'; #查看与 InnoDB 存储引擎的日志相关的配置变量
innodb_log_file_size   50331648 #每个日志文件大小  字节
innodb_log_files_in_group 2     #日志组成员个数
innodb_log_group_home_dir ./ #事务文件路径#LIKE 是 SQL 的一个条件匹配操作符,用于筛选满足指定模式的字符串。
% 是通配符,表示零个或多个字符。
'innodb_log%' 是一个模式,表示以 innodb_log 开头的字符串。ll -h /var/lib/mysql

事务日志性能优化

innodb_flush_log_at_trx_commit=0|1|2

select @@innodb_flush_log_at_trx_commit;
#查看默认值

1 此为默认值,日志缓冲区将写入日志文件,并在每次事务后执行刷新到磁盘。 这是完全遵守ACID特性

0 提交时没有写磁盘的操作; 而是每秒执行一次将日志缓冲区的提交的事务写入刷新到磁盘。 这样可提供更好的性能,但服务器崩溃可能丢失最后一秒的事务

2 每次提交后都会写入OS的缓冲区,但每秒才会进行一次刷新到磁盘文件中。 性能比0略差一些,但操作系统或停电可能导致最后一秒的交易丢失

级别012
安全性较高最高最高
性能最高最差较高

高并发业务行业最佳实践,是使用第三种折中配置(=2):

1.配置为2和配置为0,性能差异并不大,因为将数据从Log Buffer拷贝到OS cache,虽然跨越用户态与内核态,但毕竟只是内存的数据拷贝,速度很快

2.配置为2和配置为0,安全性差异巨大,操作系统崩溃的概率相比MySQL应用程序崩溃的概率,小很多,设置为2,只要操作系统不奔溃,也绝对不会丢数据

双1设置:

说明:

  • 设置为1,同时sync_binlog = 1表示最高级别的容错 (二进制日志)

  • innodb_use_global_flush_log_at_trx_commit=0 时,将不能用SET语句重置此变量( MariaDB 10.2.6 后废弃)

修改参数:
set  global innodb_flush_log_at_trx_commit=1;
select @@innodb_flush_log_at_trx_commit;
call sp_testlog;
  1. set global innodb_flush_log_at_trx_commit=1;

    • 这是一个MySQL的系统变量设置命令。innodb_flush_log_at_trx_commit 是控制InnoDB存储引擎如何处理事务提交时的日志刷新行为的参数。
    • 设置为 1 表示每次事务提交时都会强制刷新事务日志到磁盘,这是最安全的设置,可以确保事务的持久性(即事务提交后,数据不会丢失)。
    • 该设置通常用于要求高数据安全性和一致性的场景,但也可能会对性能产生一定影响。
  2. select @@innodb_flush_log_at_trx_commit;

    • 这条语句是用来查询当前 innodb_flush_log_at_trx_commit 参数的设置值的命令。
    • 如果在上一步设置成功的话,这里应该会返回 1,表示已经将参数设置为每次事务提交时都刷新日志到磁盘。
  3. call sp_testlog;

    • 这是调用一个名为 sp_testlog 的存储过程(Stored Procedure)的命令。
    • 存储过程是一组预先编译好的SQL语句集合,可以在需要时通过一个单独的调用来执行。
    • sp_testlog 是一个自定义的存储过程,它可能被用来进行一些特定的测试或者操作,具体的功能需要查看存储过程的定义来确定。

2.错误日志

错误日志

  • mysqld启动和关闭过程中输出的事件信息

  • mysqld运行中产生的错误信息

  • event scheduler运行一个event时产生的日志信息

  • 在主从复制架构中的从服务器上启动从服务器线程时产生的信息

SHOW GLOBAL VARIABLES LIKE 'log_error' ;yum  安装
cat /var/log/mysqld.log

记录哪些警告信息至错误日志文件*

#CentOS7 mariadb 5.5 默认值为1
#CentOS8 mariadb 10.3 默认值为2
log_warnings=0|1|2|3...         #MySQL5.7之前
log_error_verbosity=0|1|2|3...   #MySQL8.0

3.通用日志

通用日志:记录对数据库的通用操作,包括:错误的SQL语句

通用日志可以保存在:file(默认值)或 table(mysql.general_log表)

通用日志相关设置

general_log=ON|OFF
general_log_file=HOSTNAME.log
log_output=TABLE|FILE|NONE

示例:

范例: 启用通用日志并记录至文件中select @@general_log;     #默认没开启
set global general_log=1; #开启SHOW GLOBAL VARIABLES LIKE 'log_output';
#默认通用日志存放在文件中
select @@general_log_file;
#通用日志存放的文件路径

4.慢查询日志

慢查询日志:记录执行查询时长超出指定时长的操作

慢查询相关变量

slow_query_log=ON|OFF #开启或关闭慢查询,支持全局和会话,只有全局设置才会生成慢查询文件
long_query_time=N #慢查询的阀值,单位秒,默认为10s
slow_query_log_file=HOSTNAME-slow.log  #慢查询日志文件
log_slow_filter = admin,filesort,filesort_on_disk,full_join,full_scan,
query_cache,query_cache_miss,tmp_table,tmp_table_on_disk 
#上述查询类型且查询时长超过long_query_time,则记录日志
log_queries_not_using_indexes=ON  #不使用索引或使用全索引扫描,不论是否达到慢查询阀值的语
句是否记录日志,默认OFF,即不记录
log_slow_rate_limit = 1 #多少次查询才记录,mariadb特有
log_slow_verbosity= Query_plan,explain #记录内容
log_slow_queries = OFF    #同slow_query_log,MariaDB 10.0/MySQL 5.6.1 版后已删除set  global slow_query_log=1;
#开启
set long_query_time=1;select sleep(10)

5.二进制日志 备份

  • 记录导致数据改变或潜在导致数据改变的SQL语句

  • 记录已提交的日志

  • 不依赖于存储引擎类型

功能:通过"重放"日志文件中的事件来生成数据副本

注意:建议二进制日志和数据文件分开存放

二进制日志记录三种格式

基于"语句"记录:statement,记录语句,默认模式( MariaDB 10.2.3 版本以下 ),日志量较少

基于"行"记录:row,记录数据,日志量较大,更加安全,建议使用的格式,MySQL8.0默认格式

混合模式:mixed, 让系统自行判定该基于哪种方式进行,默认模式( MariaDB 10.2.4及版本以上)

show variables like 'binlog_format';

二进制日志文件格式

有两类文件
1.日志文件:mysql|mariadb-bin.文件名后缀,二进制格式,如: on.000001,mariadb-bin.000002
2.索引文件:mysql|mariadb-bin.index,文本格式,记录当前已有的二进制日志文件列表

二进制日志相关的服务器变量:

sql_log_bin=ON|OFF:
#是否记录二进制日志,默认ON,支持动态修改,系统变量,而非服务器选项
log_bin=mysql-bin      默认是关闭
#指定文件位置;默认OFF,表示不启用二进制日志功能,上述两项都开启才可以
binlog_format=STATEMENT|ROW|MIXED:
#二进制日志记录的格式,mariadb5.5默认STATEMENT
max_binlog_size=1073741824:
#单个二进制日志文件的最大体积,到达最大值会自动滚动,默认为1G
#说明:文件达到上限时的大小未必为指定的精确值
binlog_cache_size=4m 
#此变量确定在每次事务中保存二进制日志更改记录的缓存的大小(每次连接)
max_binlog_cache_size=512m 
#限制用于缓存多事务查询的字节大小。
sync_binlog=1|0:
#设定是否启动二进制日志即时同步磁盘功能,默认0,由操作系统负责同步日志到磁盘
expire_logs_days=N:
#二进制日志可以自动删除的天数。 默认为0,即不自动删除

在线查看  二进制

SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
例子:
show binlog events in 'mysql-bin.000001' from 6516 limit 2,3

离线查看二进制日志

mysqlbinlog:二进制日志的客户端命令工具,支持离线查看二进制日志

命令格式:

mysqlbinlog [OPTIONS] log_file…--start-position=# 指定开始位置--stop-position=#--start-datetime=  #时间格式:YYYY-MM-DD hh:mm:ss--stop-datetime= --base64-output[=name]-v -vvv# at 328
#151105 16:31:40 server id 1 end_log_pos 431   Query   thread_id=1     
exec_time=0     error_code=0
use `mydb`/*!*/;
SET TIMESTAMP=1446712300/*!*/;
CREATE TABLE tb1 (id int, name char(30))
/*!*/;  
事件发生的日期和时间:151105 16:31:40
事件发生的服务器标识:server id 1
事件的结束位置:end_log_pos 431
事件的类型:Query 
事件发生时所在服务器执行此事件的线程的ID:thread_id=1
语句的时间戳与将其写入二进制文件中的时间差:exec_time=0
错误代码:error_code=0
事件内容:
GTID:Global Transaction ID,mysql5.6以mariadb10以上版本专属属性:GTID

例子

mysqlbinlog --start-position=678 --stop-position=752 /var/lib/mysql/mariadb-bin.000003 -v
mysqlbinlog  --start-datetime="2018-01-30 20:30:10"   --stop-datetime="2018-01-
30 20:35:22" mariadb-bin.000003 -vvv

二进制日志事件的格式:

# at 328
#151105 16:31:40 server id 1 end_log_pos 431   Query   thread_id=1     
exec_time=0     error_code=0
use `mydb`/*!*/;
SET TIMESTAMP=1446712300/*!*/;
CREATE TABLE tb1 (id int, name char(30))
/*!*/;  
事件发生的日期和时间:151105 16:31:40
事件发生的服务器标识:server id 1
事件的结束位置:end_log_pos 431
事件的类型:Query 
事件发生时所在服务器执行此事件的线程的ID:thread_id=1
语句的时间戳与将其写入二进制文件中的时间差:exec_time=0
错误代码:error_code=0
事件内容:
GTID:Global Transaction ID,mysql5.6以mariadb10以上版本专属属性:GTID

 删除二进制日志

purge binary logs to 'mysql-bin.000002';
#代表删除002 之前的  日志

彻底清空二进制日志

reset  master;

刷新日志

flush logs;

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

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

相关文章

都有哪些离线翻译器软件?没网就用这4个

经历完痛苦的期末考,可算是千盼万盼等来了日思夜想的暑假!趁着这大好时光,怎么能不来一场出国游呢~ 不知道有多少小伙伴和我一样,出国玩最怕的就是语言不通,不管是吃饭还是游玩体验感都会大受影响~好在多出国玩了几趟…

ES6模块化学习

1. 回顾:node.js 中如何实现模块化 node.js 遵循了 CommonJS 的模块化规范。其中: 导入其它模块使用 require() 方法 模块对外共享成员使用 module.exports 对象 模块化的好处: 大家都遵守同样的模块化规范写代码&#xff…

Linux 时区文件格式【man 5 tzfile】

时区文件格式标准:https://datatracker.ietf.org/doc/html/rfc8536 1. NAME(名) tzfile - 时区文件。(非文本文件) 2. DESCRIPTION(描述) 本页介绍被 tzset(3) 函数使用的时区文件的结构。这…

006 线程安全

文章目录 临界资源线程安全基本概念*何谓竞态条件**何谓线程安全* 对象的安全局部基本类型变量局部的对象引用对象成员(成员变量) 不可变性 临界资源 临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源…

如何使用GPT进行科研:详细指令指南

如何使用GPT进行科研:详细指令指南 随着GPT模型的流行,越来越多的科研人员开始利用这项技术来辅助科学研究,特别是在文本处理任务如论文翻译、文本润色和降低抄袭率方面。本文将提供详细的指令,帮助科研人员有效地使用GPT进行科研…

计算机相关专业入门,高考假期预习指南

一:学习资源推荐 跟着b站的“黑马程序员”学c,黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili,把这个编程语言基础打好,然后看“蓝桥杯算法”,到了大一直接就能打蓝桥杯比赛了 看完上面的 …

TRILL简介

介绍TRILL的定义及目的。 定义 TRILL(Transparent Interconnection of Lots of Links)是一种把三层链路状态路由技术应用于二层网络的协议。TRILL通过扩展IS-IS路由协议实现二层路由,可以很好地满足数据中心大二层组网需求,为数据中心业务提供解决方案…

用数组手搓一个小顶堆

堆默认从数组下标为1开始存储。 const int N201000; int heap[N]; int len; 插入操作: 将元素插入到堆的末尾位置向上调整。 void up(int k){while(k>1&&heap[k/2]>heap[k]){swap(heap[k],heap[k/2]);k/2;} } //len为当前存在元素长度 void Inser…

水利水库大坝结构安全自动化监测主要测哪些内容?

在大坝安全自动化监测系统建设中,应根据坝型、坝体结构和地质条件等因素选定监测项目;主要监测对象包括坝体、坝基及有关的各种主要水工建筑物、大坝附近的不稳定岸坡和大坝周边的气象环境。深圳安锐科技建议参考下列表格适当调整。 (一&am…

计算机网络(2

计算机网络续 一. 网络编程 网络编程, 指网络上的主机, 通过不同的进程, 以编程的方式实现网络通信(或网络数据传输). 即便是同一个主机, 只要不同进程, 基于网络来传输数据, 也属于网络编程. 二. 网络编程套接字(socket) socket: 操作系统提供的网络编程的 API 称作 “soc…

(0)2024年基于财务的数据科学项目Python编程基础(Jupyter Notebooks)

目录 前言学习目标:学习内容:大纲 前言 随着数据科学的迅猛发展,其在财务领域的应用也日益广泛。财务数据的分析和预测对于企业的决策过程至关重要。 本专栏旨在通过Jupyter Notebooks这一强大的交互式计算工具,介绍基于财务的数…

【车载开发系列】常见单片机调试接口的区别

【车载开发系列】常见单片机调试接口的区别 【车载开发系列】常见单片机调试接口的区别 【车载开发系列】常见单片机调试接口的区别一. JTAG协议二. SWD接口三. RDI接口四. 仿真器1)J-Link仿真器2)ULink仿真器3)ST-LINK仿真器 五. SWD / JTAG…

Day05-组织架构-角色管理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.组织架构-编辑部门-弹出层获取数据2.组织架构-编辑部门-编辑表单校验3.组织架构-编辑部门-确认取消4.组织架构-删除部门5.角色管理-搭建页面结构6.角色管理-获取数…

MySQL中的DDL语句

第一题 输入密码登录mysql,创建数据库zoo,转换到zoo数据库, mysql> create database zoo character set gbk; mysql> use zoo查看创建数据库zoo信息 mysql> show create database zoo;删除数据库zoo mysql> drop database zo…

【后端面试题】【中间件】【NoSQL】MongoDB查询优化2(优化排序、mongos优化)

优化排序 在MongoDB里面,如果能够利用索引来排序的话,直接按照索引顺序加载数据就可以了。如果不能利用索引来排序的话,就必须在加载了数据之后,再次进行排序,也就是进行内存排序。 可想而知,如果内存排序…

【居家养老实训室】:看中医保健在养老中的应用

本文以居家养老实训室为视角,深入探讨了中医保健在养老中的应用。通过对中医保健理念、常用方法以及在居家养老中的具体实践进行分析,阐述了其在改善老年人健康状况、提高生活质量方面的重要作用。同时,也指出了目前应用中存在的问题&#xf…

Apache Kylin模型构建全解析:深入理解大数据的多维分析

引言 Apache Kylin是一个开源的分布式分析引擎,旨在为大数据提供快速的多维分析能力。它通过预计算技术,将数据转化为立方体模型(Cube),从而实现对Hadoop大数据集的秒级查询响应。本文将详细介绍Kylin中模型构建的全过…

Windchill的Debug配置

在windchillshell中运行以下命令 xconfmanager -s "wt.manager.cmd.MethodServer.debug.args- agentlib:jdwptransportdt_socket,servery,suspendn,address0.0.0.0:{19}" -p - t codebase/wt.properties xconfmanager -s "wt.manager.cmd.MethodServer.param.19…

2024暑假集训第三次考试

3004. Sleepy Cow Sorting 思路分析 这道题是一道思维题。 这个就要结合之前学习过的算法,看这个题目的排序方式,我们就理所当然的想到了插入排序,也是这道题的正解。只需要看看前面有几个数是无序的就是需要排的次数。转换一下,也…

【第19章】MyBatis-Plus自定义ID生成器

文章目录 前言一、如何自定义二、Spring Boot 集成1. 方式一:声明为Bean供Spring扫描注入2. 方式二:使用配置类3. 方式三:通过MybatisPlusPropertiesCustomizer自定义 三、Spring 集成1. 方式一:XML配置2. 方式二:注解…