MySQL之分布式事务

2023-11-19

写在前面

当数据库进行了分库分表 之后为了保证数据的一致性。不可变的就需要引入跨数据的事务解决方案,这种解决方案我们叫做分布式事务。本文就一起来看下分布式事务相关的内容。

8.0 版本上学习。

1:实战

为了能够更好的理解理论知识,我们先来简单看个实战,这里基于MySQL8来进行试验。我们知道,单机的事务一般是下边这样:

开启事务:
  [begin|start transaction|start transaction with consistent snapshot]
提交事务:
  commit
回滚事务:
  rollback

分布式事务也是类似的,只不过命令有所不同,下面来看下。

1.1:准备库和表

CREATE SCHEMA db;
USE db;
CREATE TABLE `t` (
  `id` INT NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_unicode_ci;

INSERT INTO t VALUES(1);
INSERT INTO t VALUES(2);

1.2:启动xa最终commit

  • 打开两个会话A,B
  • 在会话A启动xa,并执行一些更新操作
mysql> xa start 'xa-first';
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t value(333);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t value(444);
Query OK, 1 row affected (0.00 sec)
  • 在会话A执行xa end结束操作
mysql> xa end 'xa-first';
Query OK, 0 rows affected (0.00 sec)
  • 在会话A执行xa prepare准备提交
mysql> xa prepare 'xa-first';
Query OK, 0 rows affected (0.00 sec)
  • 在会话B执行查询
    此时查询不到,因为会话A的事务还没有提交(分布式事务也是事务啊!)
mysql> select * from t;
+----+
| id |
+----+
|  1 |
|  2 |
+----+
2 rows in set (0.00 sec)
  • 在会话A执行查询
mysql> select * from t;
ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global transaction is in the  PREPARED state

PREPARED状态,不让查,为啥???

  • 在会话A执行xa commit提交
mysql> xa commit 'xa-first';
Query OK, 0 rows affected (0.00 sec)
  • 在会话B执行查询
    因为事务提交了所以可以正常查询:
mysql> select * from t;
+-----+
| id  |
+-----+
|   1 |
|   2 |
| 333 |
| 444 |
+-----+
4 rows in set (0.00 sec)

1.3:启动xa最终rollback

  • 打开两个会话A,B
  • 在会话A启动xa,并执行一些更新操作
mysql> xa start 'xa-second';
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t values(555);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t values(666);
Query OK, 1 row affected (0.00 sec)
  • 在会话A执行xa end结束操作
mysql> xa end 'xa-second';
Query OK, 0 rows affected (0.00 sec)
  • 在会话A执行xa prepare准备提交
mysql> xa prepare 'xa-second';
Query OK, 0 rows affected (0.00 sec)
  • 在会话B执行查询
    此时查询不到,因为会话A的事务还没有提交(分布式事务也是事务啊!)
mysql> select * from t;
+-----+
| id  |
+-----+
|   1 |
|   2 |
| 333 |
| 444 |
+-----+
4 rows in set (0.00 sec)
  • 在会话A执行查询
mysql> select * from t;
ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global transaction is in the  PREPARED state

PREPARED状态,不让查,为啥???

  • 在会话A执行xa rollback回滚
mysql> xa rollback 'xa-second';
Query OK, 0 rows affected (0.00 sec)
  • 在会话A执行查询
    查询不到,以为回滚了:
mysql> select * from t;
+-----+
| id  |
+-----+
|   1 |
|   2 |
| 333 |
| 444 |
+-----+
4 rows in set (0.00 sec)

实战结束,接着来看理论。

2:理论

2.1:为什么需要分布式事务

任何技术和事务都不是凭空产生的,肯定都是有某种力量的推动,而对于技术而言,这种力量来源于哪里呢?毫无疑问,是用户,看如下几个例子:

1:现在有A,B两个服务,通过同步调用方式来进行通信,当请求量达到一定的量级,这种同步的调用方式可能会将B服务的系统资源耗尽,比如CPU,线程资源等,这个时候怎么办呢?自然是降低请求量,那么如何降低请求量呢?有如下的几个办法:
  1.1:让B服务多复制几份,注意!!!这个时候集群就出现了
  1.2:让B需要处理的消息,暂时存储在某个地方,消息一部分一部分的给B而非一次全部塞过去,注意!!!这样就有了JMS,就有了消息队列
2:一个单体的数据库,随着业务的发展,存储的数据越来越多,用户的访问量也越来越大,逐渐的我们会发现如下的几个问题
  2.1:数据存不下了,怎么办?那就只能把数据分开存储,注意!!!这样就有了分库分表
  2.2:数据库的读压力太大了,已经快要扛不住了,怎么办?那就再将数据复制到其他几个数据库,专门负责读吧,注意!!!这样就有了读写分离

那么我们这里要看的分布式事务,是要解决什么问题呢?解决因为分库分表带来的数据一致性问题。业务初期表都是在一个数据库里,但当分到多个库里,比如一个一张订单表,一张订单详情表,就需要通过分布式事务来解决。看下图:
在这里插入图片描述

2.2:分布式事务

2.2.1:什么叫分布式事务

在分布式的环境下,不同的节点,整体事务的一致性叫做分布式事务。或者是多个小的事务组合在一起,保证数据一致性,就叫做分布式事务。

多个节点,如果是有的节点事务成功了,有的节点事务失败了,那么对于外界来说,整体的数据就是不一致的,参考下图:

在这里插入图片描述

2.2.2:分布式事务哪些类型

分布式事务的类型我们也可以分为强一致性和弱一致性,如下:

强一致性(数据库提供保证):
  简单讲就是,效果同单机事务,数据永远是一致的,此时需要引入某种协调机制。场景如金融交易类
弱一致性(业务侧提供保证):
  简单将就是,在一段时间内数据可以是不一致的,然后通过某些定时补偿机制,柔性事务框架(tcc,saga等)达到数据的最终一致性。场景如T+1操作(转账隔天到账),电商类操作。

强一致性的数据库协议是XA(MySQL提供了具体的实现,即文章开头的实战例子),弱一致性(柔性事务)一般是通过业务冲正实现。

3:刚性事务

3.1:XA分布式事务协议角色

  • 应用程序
    Application program,简称AP。负责开始事务,执行各种操作,以及结束事务。
  • 事务管理器

事务框架如seata扮演的就是这里的角色。

Transactin Manager,简称TM,负责给事务分配唯一标识,管理事务(提交,回滚等)

  • 资源管理器
    resource manager ,简称RM,负责具体的数据存取,如MySQL

结构参考下图:
在这里插入图片描述
在这里插入图片描述

XA协议需要资源管理器和事务管理器两个角色,并定义了协议相关的接口(后面分析到),不管是资源管理器还是协议管理器都需要按照接口规范来提供实现,目前MySQL数据库在5.0版本就已经提供了具体实现,这样资源管理器就已然是提供了具体支持。为了让规范java对于事务管理器的实现,jdk按照XA协议定义了java的规范接口,这个接口规范就叫做JTA,JTA当前具体的实现框架有Atomikos,nirayana,seata等。

最后看下AP,TM,RM对应的具体都是啥:

AP:我们的应用程序,即写代码的地方
TM:如seata,atomikos,nirayana框架
RM:MySQL,也可以是mq等其它存储数据的中间件,只要按照XA协议提供具体实现即可。

3.2:XA分布式事务协议接口

  • xa-start
    开启一个事务分支,之后就可以开始调用RM来执行数据库操作了。AP调用TM完成。
  • xa-end
    结束一个事务分支,之后就无法继续调用RM执行数据库操作了。AP调用TM完成。

xa-start和xa-end之间是真实的数据库CRUD操作。

  • xa-prepare
    询问RM是否准备好提交事务,AP调用TM(TM调用RM)完成,如果该阶段成功就可以准备事务了。

处于prepare状态的RM会话内无法执行任何操作,包括select,不知道为啥!

  • xa-commit
    通过RM提交事务分支,AP调用TM,TM调用RM完成。
  • xa-rollback
    通知RM回滚事务,AP调用TM,TM调用RM完成
  • xa-recover
    需要回复的xa事务

3.3:MySQL对于xa的支持

MySQL在5.0版本中完成了对于xa的支持,可以通过show ENGINEs查看是否支持分布式事务,如下就是截图:
在这里插入图片描述

MySQL对应的xa协议语句如下(本文开头实战例子已经用过了)

xa start xid 
  开启一个事务分支,xid是事务分支的唯一标示,TM通过此标识唯一管理一个RM
xa end xid
  通过事务分支唯一标示xid,结束一个事务分支
xa prepare xid
  通过事务分支唯一标示,准备一个事务分支
xa commit xid
  通过事务分支唯一标示,提交一个事务分支
xa rollback xid
  通过事务分支唯一标示,回滚一个事务分支
xa rollback
  列出所有处于prepare状态的事务分支

需要注意,单机事务和分布式事务是互斥的,即通过了xa start开启了一个新的分布式事务分支,则不能通过start transaction启动一个本地事务,知道xa commit,或xa rollback。同理,如果是通过start transaction启动了本地单机事务,也无法通过xa start启动分布式事务分支,知道本地单机事务执行了commit,或rollback。

3.4:XA事务的状态

xa start:变为active状态
xa end:变为IDLE状态
xa prepared:变为prepared状态
xa commited:变为committed状态
xa rollback:变为aborted状态

如下图:
在这里插入图片描述

3.5:xa事务完整执行过程

参考下图:
在这里插入图片描述

可以看到对于AP来说,只需要start transaction,以及commit,所有的细节,如xa start,xa end,xa prepare,xa commit,xa rollback TM已经给我们封装好了,

异常情况分析:

1:业务sql执行过程中,即执行xa end前,某个RM崩溃?
  TM给所有的RM执行xa rollback。
2:全部prepare后,某RM崩溃,怎么办?
  TM给所有的RM执行xa rollback
3: xa commit时某个RM崩溃?
  TM重试,直到成功,一直不成功,业务侧需要有补偿机制,保证成功

使用xa来实现分布式事务的话,因为在commit或者是rollback之前,数据库资源都是锁定的,所以会严重影响并发性能,如果是长事务的话,性能会退化为原来的十分之一左右,如果是时间比较短的短事务的话,性能退化相对好些,大概是原来的三分之一。所以因为性能问题如果是不必要的话,还是要慎重使用xa事务。因此,xa适合用在低并发&短事务的场景中。

xa会导致性能的严重衰退。

4:BASE柔性事务

CAP对于大规模并不是十分适用的,因为为了保证A,可能需要很多额外的机器和组件,从而成本会比较高,为了保证C,大规模集群会降低SLO, 因此就有了BASE

BASE的BA:basically available,基本可用,是对可用的妥协,当部分节点不可用时,服务依然是可用的
BASE的S:soft state,柔性状态,即数据暂时的不一致的状态,或者是从不一致到一直变化的过程
BASE的E:eventually consistency,最终一致,即数据最终是一致的

接下来我们看下实现BASE柔性事务都有哪些模式和框架。

4.1:柔性事务模式

4.1.1:TCC

需要手动补偿事务(cancel这一步需要写代码,如try阶段执行了insert,则在cancel要写对应的delete,try阶段将id=1的name值从张三修改为例子,则在cancel要写对应的代码将)。

4.1.1.1:TCC核心内容

TCC,是try,confirm,cancel这三个单词的简称,即TCC分为两个阶段,第一个是T阶段,尝试预留资源(如扣减余额场景判断是否足够扣减,足够则先通过冻结预留资源,注意需要事务),第二个是Confirm/Cancel阶段,如果是所有的事务try都成功,则执行confirm(如扣减余额场景,真正的去扣减用户的余额,注意需要事务),否则执行cancel回滚try操作预留的资源(注意cancel需要根据不同的业务来提供具体的程序,如扣减余额场景)。具体如下:

T:try,完成业务检查(如扣减余额够扣嘛?),预留资源
C:confirm,真正的执行业务操作,如果是try成功,这一阶段一定会成功,因为已经完成了业务检查(如余额肯定是够扣减的)
C:cancel,如果是T阶段失败,则释放T阶段预留的资源,即回滚T事务产生的影响(如扣减余额场景,向冻结表中添加了100的扣减金额,则这一步需要从冻结表中删除这条记录,消除影响,恢复到初始状态,注意这里的冻结表需要我们额外创建,并开发相关程序)

TCC对业务是具有比较强的侵入性的,因为TCC中,RM不需要像XA那样具备分布式事务的能力,所有分布式事务相关的逻辑都是通过编码的方式来实现的,即在每个服务中我们都要实现相对应的try接口,confirm接口和cancel接口,参考下图:
在这里插入图片描述

4.1.1.2:TCC需要注意的问题

  • 允许空回滚
    如果是try没有成功,cancel也要允许执行,并且不能造成数据一致性问题,如在转账的场景中try阶段要冻结用户的100元,但是最终没有冻结成功,则在cancel阶段不能反向冻结这100元,而是应该什么都不做,因为try本来就什么都没有做。相关的框架要考虑到这种情况的处理。
  • 防悬挂
    当cancel早于try收到,此时可能出现先执行cancel,后执行try的情况,那么try就没有机会取消了,这种情况叫做悬挂,应该防止这种情况的发生。

比如转账的场景中,在try阶段要冻结用户的100元人民币,cancel阶段取消冻结用户的100元人民币,如果是cancel先执行的话,那么用户的100元人民币就永远冻结了。相关的框架要考虑到这种情况的处理。

  • 幂等
    不管是try,confirm,cancel,都需要时幂等的,即多次调用的效果和一次调用是一样的。相关的框架要考虑到这种情况的处理。

比如转账的场景中,try阶段要冻结用户的100元人民币,如果是调用多次就多次冻结用户的钱,那就出问题了。转100,却少了300 o(╥﹏╥)o。

4.1.2:AT

AT的A是automatic的意思,即一种自动的分布式事务模式,这里我们可以和手动的TCC来对比看,手动的TCC手动是体现在cancel阶段,需要开发人员来实现对应的取消try逻辑,而AT的自动也体现在这里,因为这个取消的逻辑是自动生成的。另外AT不同于TCC,其是两阶段的,即直接提交事务,以及回滚事务,如下图:
在这里插入图片描述

但是目前这种方式使用的是不多的,因为这里要实现automatic需要有支持解析sql为反向操作sql的框架的支持,但是目前还没有一种框架可以做到百分之百的支持(因为sql太灵活了,各种写法,就像积木一样,你可以搭建成各种样式的!!!)。所以在业务中就不要考虑这种方式了。

4.1.3:SAGA

saga由多个小事务组成,每个小事务都有对应的回滚逻辑事务,这种方式更符合常规的思维方式,所以当前这种模式是使用的最多的,如下图:
在这里插入图片描述

4.2:柔性事务的隔离级别

注意是量分布式事务作为一个整体来分析。

  • 原子性
    基本(atomicity),正常情况下保证(分布式事务无法做到百分之百的没有问题,所以需要一些额外的补偿机制)
  • 一致性
    在某些时间点,是不一致的。但最终是一致的。
  • 隔离性
    在某些时间点,不满足隔离性,因为本质上每个数据库上的事务还是独立的,只不过所有的小事务在逻辑上组成了整体的分布式事务。
  • 持久性
    分布式事务最终都提交成功之后是持久的(因为每个独立的事务肯定是满足持久性的,所以整体的分布式事务也是满足持久性的)

4.3:柔性事务框架

4.3.1:seata

seata是阿里和蚂蚁金服共同开发的分布式事务框架,支持TCC模式,AT模式两种。

4.3.2:hmily

hmily 支持TCC,模式,功能更加全面,也有UI操作界面,可以考虑使用起来。

base柔性事务也可以说是业务侧的分布式事务,因为需要在业务测编写响应的代码来保证分布式事务的一致性,在db侧其实还是单机事务的,所以,这种方式,对于性能的并不是非常严重,即略有衰退,大概衰退为原来的百分之六十到百分之七十左右,因此这种方式适合用在高并发&长事务中。

4.3.3:shardingsphere

shardingsphere准确来说并不是一个分布式事务框架,因为其只是对相关的框架做了封装,如下对基于XA的刚性事务框架atomikos,nirayana的封装结构图:
在这里插入图片描述

如下是对柔性事务框架的支持:
在这里插入图片描述

写在后面

参考文章列表

总结

分布式事务是为了解决微服务场景下跨多服务多数据库组件操作的数据库一致性问题,分为刚性事务和柔性事务,其中XA协议是实现刚性事务,对应的框架有atmikos,nirayana,seata,柔性事务TCC,框架tcc transaction,seata。刚性事务属于同步操作,适合于短时间的小事务,实现强一致性。柔性事务实现的最终一致性。

seata即支持xa的刚性事务,也支持tcc的柔性事务。我们说seata支持不同的事务模式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL之分布式事务 的相关文章

  • MySQL 和 Hibernate 之间的主键自增由谁负责?

    MySQL CREATE TABLE role id role INT 11 unsigned NOT NULL AUTO INCREMENT PRIMARY KEY id role AUTO INCREMENT 1 休眠 Entity p
  • MySql 5.7 ORDER BY 子句不在 GROUP BY 子句中并且包含非聚合列

    我试图在不禁用 my ini 中的 only full group by 的情况下弄清楚 这是我的查询 SELECT p title COUNT t qty AS total FROM payments t LEFT JOIN produc
  • db:schema:load 与 db:migrate 使用 capistrano

    我有一个 Rails 应用程序 我正在将其移动到另一台服务器 我认为我应该使用 db schema load 来创建 mysql 数据库 因为这是推荐的 我的问题是我正在使用 capistrano 进行部署 并且它似乎默认为 rake db
  • WPF 创建同级窗口并关闭当前窗口

    我需要的是我的窗口类中的这样一个事件处理程序 void someEventHandler object sender RoutedEventArgs e MyNewWindow mnw new MyNewWindow mnw Owner W
  • PHP PDO 使用 bindParam 第一个参数(不带冒号)[重复]

    这个问题在这里已经有答案了 请检查这个 user id int GET user id sql DELETE FROM users WHERE user id user id query db gt prepare sql query gt
  • 每月获取记录,但如果该月没有记录,则为零

    如果我有以下 SQL 表 Tests id type receiveDate 1 Blood 2012 01 18 2 Blood 2012 01 20 3 Blood 2012 01 18 4 Blood 2012 03 01 5 Blo
  • 无法在 Mac 上启动 MySQL

    使用 Brew 安装后 我无法运行 MySQL 我使用的是 OS X El Capitan 版本 10 11 3 和 MySQL Server 版本 5 7 11 当我启动服务器时 我收到 启动 MySQL 错误 服务器退出而不更新 PID
  • mysql 中的二进制、十六进制和八进制值

    我对在 mysql 数据库中使用二进制 十六进制和八进制系统非常感兴趣 首先 请给我一个建议 为什么我们在存储信息时需要它们 因为信息太多 或者为什么 另外 哪种类型的值必须存储在标记系统中 另外这里还有像 这是例子 gt SELECT 5
  • MySQL中如何声明变量?

    如何在mysql中声明一个变量 以便我的第二个查询可以使用它 我想写一些类似的东西 SET start 1 SET finish 10 SELECT FROM places WHERE place BETWEEN start AND fin
  • 在 jQuery AJAX 成功中从 MySql 获取特定响应

    好吧 我有这个 ajax 代码 它将在 Success 块中返回 MySql 的结果 ajax type POST url index php success function data alert data My Query sql SE
  • 如何从批量数据中的mysql列中删除所有非数字字符

    我想从列中删除所有非数字字符 我的数据库中有大量数据 目前我正在使用以下链接中描述的方法 http venerableagents wordpress com 2011 01 29 mysql numeric functions http
  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • 在 SQL 中,如何从 SELECT * FROM ... 中排除结果?

    我知道我的标题不太具有描述性 让我在这里详细解释一下 假设一个表有 26 个字段 例如字段 a 字段 z 我只想要一个选择查询只返回 15 个字段 所以 通常 我会执行 SELECT field a field b field o FROM
  • Mysql用in语句限制

    我正在写一个查询 SELECT user bookmarks id as user bookmark id bookmark id user bookmarks user id bookmark url bookmark website b
  • 如何通过Elasticsearch模糊匹配电子邮件或电话?

    我想通过 Elasticsearch 对电子邮件或电话进行模糊匹配 例如 匹配所有以以下结尾的电子邮件 gmail com or 匹配所有电话开头136 我知道我可以使用通配符 query wildcard email gmail com
  • 主从视图中聚合详细信息值

    我在一些自定义实体中有主从关系 假设我有以下结构 class Master INotifyPropertyChanged public int Id get set property changed implementation publi
  • MySQL 追加字符串

    How can I append a string to the end of an existing table value Let s say I have the table below And let s say that Mari
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val

随机推荐

  • ChatGPT到底怎么用?

    ChatGPT简介 ChatGPT Chat Generative Pre trained Transformer 全称为生成型预训练变换模型 由美国 OpenAI团队研发 现如今的ChatGPT不仅可以根据聊天上下文进行交互 还可以进行文
  • nodejs之express(二)get和post请求

    获取请求中的参数 nodejs的 express框架 提供了四种方法来实现 req body 解析body不是nodejs默认提供的 需要载入body parser中间件才可以使用req body 此方法通常用来解析POST请求中的数据 2
  • Hadoop3.1.3 集群环境搭建

    Hadoop3 1 3 集群环境搭建 1 集群环境配置 主机名 HDFS YARN IP地址 说明 hadoop0 DataNode NameNode NodeManager 192 168 108 10 主节点 master hadoop
  • 在Ubuntu 18.04系统上安装Jenkins

    该教程只介绍如何在Ubuntu系统上安装Jenkins 想要了解的更多 请访问Jenkins官方安装教程 一 系统要求 最低推荐配置 256MB可用内存 1GB可用磁盘空间 作为一个Docker容器运行jenkins的话推荐10GB 为小团
  • xe7 安装chrome组件(CEF4Delphi)

    缘起 大屏项目需要用到chrome组件 但为了实现firemonkey的矢量和强大的图形功能 所以只能重新在xe7中安装chrome组件 碰到了一些问题 都一 一化解了 将整个过程记录下来 以供大家采用 1 下载CEF4Delphi mas
  • 第5节 实现Callable 接口

    Java 5 0 在java util concurrent 提供了一个新的创建执行 线程的方式 Callable 接口 Callable 接口类似于Runnable 两者都是为那些其实例可能被另一个线程执行的类设计的 但是 Runnabl
  • 阿里代码规范检查工具的安装使用

    阿里巴巴于 10 月 14 日在杭州云栖大会上 正式发布众所期待的 阿里巴巴 Java 开发规约 扫描插件 简单了解一下这插件 该插件由阿里巴巴 P3C 项目组研发 代码已经开源 GitHub https github com alibab
  • 【python】emoji库,增添趣味!

    今天说一下python的外置库emoji 里面提供超多表情使用 一 安装环境 emoji库使用pip接口进行安装 pip install emoji 二 了解下emoji库函数的使用 两个主要用的函数 emoji emojize 根据 co
  • python网络通信时出现乱码_解决Python发送Http请求时,中文乱码的问题

    解决方法 先encode再quote 原理 msg encode utf 8 是解决中文乱码问题 quote 假如URL的 name 或者 value 值中有 或者 等符号 就会有问题 所以URL中的参数字符串也需要把 等符号进行编码 qu
  • 注册ActiveX控件的几种方法

    使用ActiveX控件可快速实现小型的组件重用 代码共享 从而提高编程效率 降低开发成本 但是ActiveX控件对于最终用户并不能直接使用 因为ActiveX控件必须先在Windows中注册 注册ActiveX控件一般来说有六种途径 它们有
  • 请确保此文件可访问并且是一个有效的程序集或COM组件

    重装系统后 打开项目发现一个dll引用失败 于是重新添加引用 结果报错 请确保此文件可访问并且是一个有效的程序集或COM组件 报错是因为此程序集 com组件未注册而导致不能直接引用 解决方法 首先复制程序集所在的路径 如 E aaaa bb
  • Transformer 综述 & Transformers in Vision: A Survey

    声明 因本人课题只涉及图像分类和目标检测 且此综述对这两个领域调查的比较多 所以此文章只对图像分类和目标检测进行精读 若是对 中的论文感兴趣 到原论文中查阅参考文献即可 下图是综述内容涉及的计算机视觉十大领域 图像识别 目标检测 语义和实例
  • Linux命令-推荐

    大侠必备 杀进程 命令 ps ef grep java 先查java进程ID kill 9 PID 生产环境谨慎使用 kill killall pkill命令的区别 kill 通过pid来杀死进程 killall killall 参数 进程
  • JVM参数之GC日志配置

    说到 Java 虚拟机 不得不提的就是 Java 虚拟机的 GC Garbage Collection 日志 而对于 GC 日志 我们不仅要学会看懂 而且要学会如何设置对应的 GC 日志参数 为了能够更直观地显示出每个参数的作用 我们将以下
  • python case when用法_case when

    case when的表达式形式 1 简单Case函数 CASE sex WHEN 1 THEN 男 WHEN 2 THEN 女 ELSE 其他 END 2 Case搜索函数 CASE WHEN sex 1 THEN 男 WHEN sex 2
  • 【asm基础】nasm和masm的一些区别

    差异点说明 1 nasm是区分大小写的 2 nasm中访问内存需要使用 将内存地址括起来 例如 bar equ 2 mov rax bar mov rax bar 这个才是存储地址中内容的操作 3 nasm不存储类型信息 所以也不能使用MO
  • Vue组件按需引入时v-if和v-show的区别

    普通加载 在父组件中先import子组件 然后在components模块中注册子组件 在进 入页面时 会随着加载当前页面的js文件就加载子组件的内容 子组件的内容和父组件的内容在同一个js文件 按需加载 子组件显示的时候 才会去加载子组件的
  • fastcgi 环境变量例子

    例如请求的url http 172 28 250 184 8099 aa php var ccccc value bbbbbb 前两个字节分别代表 变量名长度 和 变量值长度 0x0f0x0fSCRIPT FILENAME scripts
  • [转][SoC][DV]关于加快验证收敛的一些方法

    关于加快验证收敛的一些方法 一 自动生成uvm验证环境 uvm gen 二 自动生成agent UVC VIP agent gen 三 模块化设计Clock以及reset的产生 clock agent 四 后台磁盘管理并且定期清理log r
  • MySQL之分布式事务

    写在前面 当数据库进行了分库分表 之后为了保证数据的一致性 不可变的就需要引入跨数据的事务解决方案 这种解决方案我们叫做分布式事务 本文就一起来看下分布式事务相关的内容 在8 0 版本上学习 1 实战 为了能够更好的理解理论知识 我们先来简