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之分布式事务 的相关文章

  • 条件触发器的Django迁移sql

    我想创建一个触发器 仅在满足条件时插入表 我尝试过使用 IF BEGIN END 和 WHERE 的各种组合 但 Django 每次都会返回 SQL 语法错误 这里 type user id指的是触发该事件的人 user id指的是接收到通
  • 奇怪的 MySQL Python mod_wsgi 无法连接到 'localhost' (49) 上的 MySQL 服务器问题

    StackOverflow上也有类似的问题 但我还没有发现完全相同的情况 这是在使用 MySQL 的 OS X Leopard 机器上 一些起始信息 MySQL Server version 5 1 30 Apache 2 2 13 Uni
  • WPF - 路径几何...有没有办法绑定数据属性?

    我有一个ControlTemplate作为 气泡 弹出窗口AdornerLayer给定的控制 它工作正常 但我需要能够计算它应该显示的位置 中间 底部 代替
  • 如何将 WPF 大小转换为物理像素?

    将 WPF 与分辨率无关 宽度和高度转换为物理屏幕像素的最佳方法是什么 我正在 WinForms 表单中显示 WPF 内容 通过 ElementHost 并尝试制定一些大小调整逻辑 当操作系统以默认 96 dpi 运行时 我可以正常工作 但
  • phpActiveRecord 日期时间格式不正确

    当尝试使用 phpActiveRecord 在表中创建记录时 出现以下错误 Invalid datetime format 1292 Incorrect datetime value 2013 06 20 11 59 08 PDT for
  • MySQL 中 INDEX、PRIMARY、UNIQUE、FULLTEXT 之间的区别?

    创建MySQL表时PRIMARY UNIQUE INDEX和FULLTEXT有什么区别 我将如何使用它们 差异 KEY or INDEX指的是普通的非唯一索引 索引的非不同值是允许的 因此索引may索引的所有列中包含具有相同值的行 这些索引
  • 如何在 MySQL 中构建跨数据库查询?

    我在同一台服务器上有两个数据库 谷歌给了我一些提示 但我找不到任何 官方 的东西 有人可以向我指出解释如何执行此操作的文档吗 使用 PHP 进行解释也很有用 谢谢 我在同一台服务器上有两个数据库 如何在 MySQL 中构建跨数据库查询 您可
  • 如何将数据源url查询参数添加为application.properties?

    是否可以添加数据源 url 参数作为额外属性 或者我总是必须将它们作为查询参数直接附加到 url 中 Example spring datasource url jdbc mysql localhost test useSSL false
  • 从名字和姓氏生成唯一的用户名?

    我的数据库中有很多用户 我想将他们的所有用户名重置为他们名字的第一个字母 加上他们的完整姓氏 正如你可以想象的那样 有一些骗子 在这种情况下 我想在用户名末尾添加 2 或 3 或其他内容 我将如何编写查询来生成这样的唯一用户名 UPDATE
  • XP及PHP MYSQL 练级系统

    我已经查看了所有提出的问题和答案 但我似乎找不到最适合我的答案 我想做的是开发一个系统 当用户达到一定的 XP 限制时 系统会进入下一个级别 它显示了下一个 XP 之前需要多少 XP So lvl1 0 gt lvl2 256 gt lvl
  • 如何将条件聚合 mysql 转换为 laravel 查询?

    我的sql查询是这样的 SELECT a number a description MAX CASE WHEN b attribute code brand then b attribute value END as brand MAX C
  • WPF .exe - 大文件大小

    我正在开发一个 WPF 应用程序 发现 exe 大小超过 1 2MB 我想减少最终可执行文件的大小 代码不过200kb 我在项目中使用了一些 png图片 总共占用了20kb左右 为什么最终的可执行文件这么大 我使用 ILDASM 统计信息来
  • 由于缺少 PHP 扩展,CakePHP 3 无法连接到数据库

    我正在尝试使用 WT NMP 安装 cakePHP 3 0 0 但收到以下消息 CakePHP 无法连接到数据库 由于以下原因无法使用数据库驱动程序 Cake Database Driver Mysql 缺少 PHP 扩展或未满足的依赖项
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • 'numpy.float64'对象没有属性'translate'在Python中将值插入Mysql

    import dataset db dataset connect table db 当我尝试向 Mysql 表中插入一些值时 发生了此错误 我插入表中的示例值 print Buy ticker price date OType OSize
  • mysql 详细查询字符串,如通配符

    不知道如何标题我的问题 哈哈 下面是我需要的 我的数据库中的值如下所示 test example 1 test example 2 test example TD 1 这些值的长度可以不同 test example 只是一个示例 某些值将具
  • PHP 和 MySQL 的重音字符错误

    我的问题是 直接通过 PHP 编写的内容是正确重音的 但是当重音单词来自 MySQL 时 字母会像这样 我尝试使用html charset as ISO 8859 1它修复了 MySQL 字母 但破坏了其他字母 解决这一切的一种方法是设置我
  • 如何使用php在mysql数据库中添加照片? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我对 PH
  • Mac OSX 10.6 上的 Python mysqldb 不工作

    我正在使用 Python 2 7 并尝试让 Django 项目在 MySQL 后端运行 我已经下载了 mysqldb 并按照此处的指南进行操作 http cd34 com blog programming python mysql pyth
  • mod_rewrite, .htaccess 连接mysql数据库

    我希望 htaccess 文件中的 mod rewrite 链接到 mysql 数据库以向我提供映射信息 具体来说 我使用单个代码库来托管多个站点 因此 如果用户请求图像 例如 http www example com images car

随机推荐

  • 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 实战 为了能够更好的理解理论知识 我们先来简