ShardingSphere-XA事务无法恢复问题定位
ShardingSphere-XA事务无法恢复问题定位问题背景在测试 ShardingSphere-Proxy 使用达梦数据库开启 XA 事务进行压测期间,kill 掉达梦数据库,等一段时间再重启达梦数据库,最终未完成的 XA 事务无法恢复,数据产生不一致。查看达梦上的 xid 一直有残留,没有被处理。使用 ShardingSphere-Proxy 结合其他主流数据库进行测试时无该问题。
通过日志可以看到在压测期间,挂掉达梦数据库之后,有大量连接报错。节选错误日志如下:比如下面这段日志,在执行 xa end 操作时,因为达梦数据库连接不上,达梦驱动报错如下:
1234567891011121314151617181920212223242526272829[WARN ] 2024-01-29 11:11:19.867 [Connection-82-ThreadExecutor] com.arjuna.ats.jta - ARJUNA016041: prepare on < formatId=131077, gtrid_length=64, bqual_length=36, tx_ ...
ShardingSphere-inline表达式线程安全问题定位
ShardingSphere inline表达式线程安全问题定位问题背景春节期间发现 ShardingSphere 事务 E2E 偶发执行失败问题,并且每次执行失败需要执行很久,直到超时。最终定位发现 inline 表达式存在线程安全问题。本文记录定位并解决 inline 表达式线程安全问题的过程。
问题原因1.GroovyInlineExpressionParser 里有成员变量,存在并发修改,不能使用单例 SPI 实现;2.执行 Groovy 表达式时,需要执行 rehydrate 方法 copy Closure,使得每个 Closure 都有独立的执行环境,避免属性赋值时产生线程安全问题。
问题定位构造测试用例尝试复现问题构造测试用例,且在测试用例中添加线程相关信息,观察执行结果。
1234567891011121314151617181920212223242526272829@Test@SneakyThrows({ExecutionException.class, InterruptedException.class})void assertThreadS ...
Percolator 分布式事务原理
Percolator 分布式事务原理简介Percolator 提供了跨行、跨表的、基于快照隔离的 ACID 事务。
结构Percolator 为了实现分布式事务,抽象了三个列。
1234567891011121314151617181920212223242526列 Data 作用: 具体存储数据集 映射关系: {key, start_ts} => {value} key: 真实的 key start_ts: 事务开始时间戳 value: 真实的数据值 Lock 作用: 事务执行中产生的锁 事务开启时获取锁 事务提交时释放锁 映射关系: {key, start_ts} => {primary_key, lock_type,..etc} key: 数据的 k ...
Otter环境搭建
IDEA 搭建 Otter 源码 DEBUG 环境在适配 ShardingSphere-JDBC 同步 Otter 时,本地搭建 Otter Debug 环境记录。
1.源码编译启动编译1234# 参考官方文档,安装 otter/lib 目录下的依赖。mvn install:install-file -Dfile=/otter/lib/jtester-1.1.8.jar -DgroupId=org.jtester -DartifactId=jtester -Dversion=1.1.8 -Dpackaging=jarmvn install:install-file -Dfile=/otter/lib/ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0 -Dpackaging=jar
使用jdk8,按照官方文档编译即可。https://github.com/alibaba/otter
manager 模块启动1.参考官方文档,初始化 otter manager mysql 相关表。https://gi ...
Spring 事务实现
Spring 事务实现Spring 事务使用123456789101112131415161718192021222324@Transactional注解配置项 事务传播行为 PROPAGATION_REQUIRED 当前方法必须在事务中,没有就创建,有就加入。 PROPAGATION_SUPPORTS 有事务就加入,没有就以非事务方式执行。 PROPAGATION_MANDATORY 有事务就加入,没有就抛出异常。 PROPAGATION_REQUIRES_NEW 永远创建新事务执行,之前若有事务则挂起之前的事务。 PROPAGATION_NOT_SUPPORTED 以非事务方式执行。之前若有事务则挂起之前的事务。 PROPAGATION_NEVER 以非事务方式执行。之前若有事务则抛出异常。 PROPAGATION_NESTED ...
Ubuntu Desktop 死机处理
Ubuntu Desktop 死机处理当 Ubuntu Desktop 死机时,除了长按电源键重启,还可以使用如下两种方式处理。
方式1:ctrl+alt+Fn使用 ctrl + alt + F3~F6: 切换到其他 tty 命令行。执行 top 命令查看资源占用最多的进程,然后使用 kill 命令杀死进程即可。然后使用 ctrl + alt + F1 切回到桌面。
方式2:REISUBbuiser 组合键:<Ctrl+Alt> + <Sysrq/PrtSc> + <REISUB>
操作:按住 ctrl + alt + sys rq(prt sc) 键不放,然后依次按下 R、E、I、S、U、B 按键,全部按完之后,系统自动重启。
作用:按住 Sys Rq,此时输入的一切都会直接由 Linux 内核来处理,它可以执行许多低级操作。此时 reisub 中的每一个按键都对应一个独立操作,他们分别表示:nRaw: 将键盘控制从 X Server 那里抢回来,以确保可以与内核通信。tErminate: 给所有进程发送 SIGTERM 信号,让进程可以执行清理操 ...
Ubuntu Desktop 软件包管理
ubuntu desktop 软件包管理ubuntu desktop 常见的包格式有 deb, AppImage, snap, Flatpak 等。本文介绍这几种格式软件的安装方法。
1.deb 格式使用 apt 命令管理 deb 包详细查看 man apt。
apt是一个命令行程序,用于在Ubuntu,Debian和基于Debian的Linux发行版上安装,更新,删除和管理软件。
如果安装包位于您的当前工作目录中,则可以使用相对路径./。否则,apt会尝试从Ubuntu的软件源中检索并安装软件包。
apt软件管理器会自动解决并安装你在安装本地deb文件时所需的依赖软件。
12345678910111213# 安装apt install package_name# 从当前路径下查找安装 deb 包sudo apt install -y ./teamviewer_amd64.deb # 查找包apt list --installed | grep -i chrome# 查看包信息apt info exact_package_name# 移除包sudo apt remove exact_p ...
Ubuntu Desktop 22.04 桌面主题配置
Ubuntu Desktop 22.04 桌面主题配置使用这么久 Ubuntu Desktop,本着不折腾的原则,简单介绍下自己的桌面主题配置。
123安装 tweaks安装 GNOME Shell安装 GNOME theme
安装 gnome-tweaks & chrome-gnome-shell123sudo apt update# 安装 gnome-tweaks 和 chrome-gnome-shellsudo apt install gnome-tweaks chrome-gnome-shell
gnome 插件安装Ubuntu 20.04 默认使用的是 gnome 的桌面环境,gnome 插件的下载地址:gnome extensions直接搜索需要的插件安装即可。
命令行管理 gnome shell extensions12345678910cd ~/.local/share/gnome-shell/extensions# 查看使用说明gnome-extensionsgnome-extensions list# 开启gnome-extensions enable ...
分布式数据库-全局时钟
分布式数据库-全局时钟之前在 ShardingSphere 中基于 TSO 实现了全局逻辑时钟的特性,配合 openGauss 数据库,提供分布式事务实时一致性读能力。下面介绍全局时钟。
全局时钟作用为了实现分布式一致性,需要对分布式环境下的操作排序,所以依赖全局时钟。包括分布式环境下实现分布式数据库全局 MVCC 也要依赖全局时钟。
全局时钟分类分布式系统获取时间有两种方式:物理时钟 与 混合逻辑时钟。
而由于物理时间全局不统一,分布式系统大部分使用逻辑时间。
常见的全局时钟方案如下:
TSO(Timestamp Oracle)单点授时(同时只能有一台服务器提供授时服务)。本质是一个单调递增的全局时间戳。
优点:实现简单,不存在不一致问题。
缺点:存在单点问题。
使用:TIDB,polardbx,OceanBase,GoldenDB
HLC(Hybrid Logical Clock)实现较为复杂。集群内可以有多个服务器同时提供授时服务。
可以保证同一个进程内部事件的时钟顺序,但是解决不了系统外事件发生的逻辑前后顺序与物理时间前后顺序的一致性,会有时间误差。
使用:CockroachD ...
事务异常场景
事务异常场景A Critique of ANSI SQL Isolation Levels 论文里的异常图// TODO image
P0 Dirty Write:脏写
P1 Dirty Read:脏读
P4C Cursor Lost Update:游标丢失更新
P4 Lost Update:丢失更新
P2 Fuzzy Read:不可重复读
P3 Phantom:幻读
A5A Read Skew:读偏序
A5B Write Skew:写偏序
脏读读到另一个事务尚未提交的数据。
不可重复读同一个事务内多次读,读到的数据不同,也就是当前事务读到了其他事务提交的数据。
幻读事务内多次查询一个范围的记录,返回的记录数不同。
脏写当前事务回滚了其他事务提交的数据。T1更新;T2更新;T1回滚,回滚掉了T2的更新
丢失更新当前事务提交覆盖了其他事务提交的数据。T2更新;T1更新;T1提交,覆盖掉了T2的更新。
游标丢失更新本质上就是丢失更新,只是因为发生在游标上,所以称之为游标丢失更新。
读偏序(读倾斜)t0时刻:T1读取x;t1时刻:T2更新x,y;T2 ...