- 关于TIDB.
- 快速启动
- 部署
- 迁移
- 维持
- 升级
- 规模
- 备份还原
- 使用BR工具(推荐)
- 配置时区
- 每日检查表
- 保持TiFlash
- 使用tiup保持tidb
- 修改配置在线
- 监控和警报
- 进行故障排除
- 性能调整
- 教程
- TIDB生态系统工具
- 参考
- 集群架构
- 主要监控指标
- 安全的
- 特权
- SQL.
- SQL语言结构和语法
- SQL语句
添加列
添加索引
行政
管理员取消DDL.
管理校验和表
管理员检查(表|索引)
管理员显示DDL [作业|查询]
修改数据库
改变索引
改变实例
改变表
改变用户
分析表
备份
开始
更改专栏
犯罪
换流器
改变泵
创建全局|会话绑定
创建数据库
创建索引
创建角色
创建序列
创建表
创建表
创建用户
创建视图
达成协议
删除
DESC
描述
做
删除[全局|会话]绑定
丢弃栏
删除数据库
指数下降
下降角色
下降序列
下降统计信息
下拉表
减少用户
掉落视图
执行
解释分析
解释
闪回表
齐平特权
冲洗状态
冲洗表
grant
授予<角色>
插入
杀死[tidb]
加载数据
加载数据
修改列
准备
恢复表格
重命名索引
重命名表
代替
恢复
撤消
撤销> <作用
回滚
选择
设置默认角色
设置(名字|字符集)
设置密码
设置角色
设置交易
设置[全局|会话] <变量>
显示分析状态
显示[备份|恢复]
显示[全局|会话]绑定
显示内置命令
显示字符集
显示排序
显示[完整]列
显示配置
显示创建序列
显示创建表
显示创建用户
显示数据库
显示排水机状态
展示引擎
显示错误
显示[完整]字段
展示补助金
显示索引[来自|在]
显示索引[来自| IN]
显示键(从|)
显示主状态
显示插件
显示权限
显示[全部]PROCESSSLIST
显示个人资料
显示泵状态
显示模式
显示STATS_HEALTHY
show stats_histographs.
show stats_meta.
显示状态
show table next_row_id.
显示表区域
显示表状态
显示[全]表格
显示[全局|会话]变量
显示警告
关掉
分地区
开始事务
表格
跟踪
截短
更新
用
和
- 数据类型
- 功能和运营商
- 聚集索引
- 约束
- 生成的列
- SQL模式
- 交易
- 垃圾收集(GC)
- 的观点
- 分区
- 字符集和整理
- 系统表
mysql
- Information_Schema.
- 概述
分析_Status.
CLIENT_ERRORS_SUMMARY_BY_HOST
client_errors_summary_User.
client_errors_summary_global.
CHARACTER_SETS
cluster_config
cluster_hardware
cluster_info.
CLUSTER_LOAD
cluster_log.
cluster_systeminfo.
拼写
collation_character_set_applicability
列
DATA_LOCK_WAITS
ddl_jobs.
死锁
引擎
检查_议程
检查_RULES.
INSPECTION_SUMMARY
key_column_usage.
metrics_summary.
metrics_tables.
分区
PROCESSLIST
引用_Constraints.
架构
序列
session_variables.
SLOW_QUERY
统计数据
桌子
TABLE_CONSTRAINTS
TABLE_STORAGE_STATS
TIDB_HOT_REGIONS
tidb_indexes.
tidb_servers_info.
TIDB_TRX
tiflash_replica
tikv_region_peers.
TIKV_REGION_STATUS
TIKV_STORE_STATUS
user_privileges.
的观点
metrics_schema.
- UI.
- CLI.
- 命令行标记
- 配置文件参数
- 系统变量
- 存储引擎
- Tiup.
- 遥测
- 错误代码
- 表筛选器
- 按拓扑标签安排副本
- 常见问题解答
- 词汇表
- 发行说明
- 所有发布
- v5.2.
- v5.1.
- v5.0.
- v4.0.
- v3.1.
- v3.0.
- v2.1.
- v2.0.
- v1.0.
交易
TIDB支持使用的分布式事务悲观或乐观的交易模型。从TIDB 3.0.8开始,TIDB默认使用悲观事务模型。
本文档介绍了常用的交易相关的语句,显式和隐式事务,隔离级别,延迟检查约束和事务大小。
常见变量包括autocommit
那tidb_disable_txn_auto_retry.
那tidb_retry_limit.
,tidb_txn_mode
.
笔记:
这
tidb_disable_txn_auto_retry.
和tidb_retry_limit.
变量只适用于乐观事务,不适用于悲观事务。
共同陈述
开始交易
句法:
开始;
开始交易;
开始交易和持续的快照;
开始交易和因果关系仅限;
如果当前会话在执行这些语句之一时在事务的过程中,TIDB在开始新事务之前会自动提交当前事务。
笔记:
与MySQL不同,TIDB在执行上面的语句后拍摄当前数据库的快照。mysql
开始
和开始事务
执行第一个后拍摄快照选择
声明(不是选择更新
)从事务启动后从InnoDB读取数据。使用一致快照启动事务
在执行语句期间拍摄快照。其结果,开始
那开始事务
,使用一致快照启动事务
相当于使用一致快照启动事务
在MySQL。
提交交易
该声明犯罪
指示TIDB应用当前事务中所做的所有更改。
句法:
犯罪;
提示:
确保您的应用程序正确处理了一个
犯罪
语句可以在启用之前返回错误乐观交易.如果您不确定您的应用程序如何处理此操作,则建议使用默认值悲观交易.
回滚事务
该声明回滚
回滚并取消当前事务中的所有更改。
句法:
回滚;
如果客户端连接被中止或关闭,事务也会自动回滚。
autocommit
根据MySQL兼容性所需,TIDB将默认情况下autocommit执行后立即进行陈述。
例如:
mysql>创建表格t1(->ID㈡不零基本的钥匙自动递增那->PAD1.varchar.(One hundred.)->);查询好了那0.行做作的(0.09秒)mysql>选择@@autocommit.;+--------------+|@@autocommit.|+--------------+|1|+--------------+1排在放(0.00秒)mysql>插入成t1值(1那“测试”);查询好了那1排做作的(0.02秒)mysql>回滚;查询好了那0.行做作的(0.01秒)mysql>选择*从t1;+----+------+|ID|PAD1.|+----+------+|1|测试|+----+------+1排在放(0.00秒)
在上面的例子中,回滚
声明没有效果。这是因为插入
语句是在autocommit中执行的。也就是说,它相当于以下单一语句事务:
开始交易;插入成t1值(1那“测试”);犯罪;
如果已明确启动事务,则无法应用AutoCommit。在以下示例中,回滚
声明成功恢复了插入
声明:
mysql>创建表格t2(->ID㈡不零基本的钥匙自动递增那->PAD1.varchar.(One hundred.)->);查询好了那0.行做作的(0.10秒)mysql>选择@@autocommit.;+--------------+|@@autocommit.|+--------------+|1|+--------------+1排在放(0.00秒)mysql>开始交易;查询好了那0.行做作的(0.00秒)mysql>插入成t2值(1那“测试”);查询好了那1排做作的(0.02秒)mysql>回滚;查询好了那0.行做作的(0.00秒)mysql>选择*从t2;空放(0.00秒)
这autocommit
系统变量可以改变在全球或会议的基础上。
例如:
放autocommit=0.;
放全球的autocommit=0.;
显式和隐式事务
笔记:
有些陈述是隐式犯下的。例如,执行
[开始|开始交易]
隐式提交最后一个事务并启动一个新事务。这种行为是MySQL兼容性所必需的。指隐含的承诺更多细节。
TIDB支持显式交易(使用[开始|开始交易]
和犯罪
定义事务的开始和结束)和隐式事务(设置autocommit = 1
)。
如果设置值autocommit
来1
并通过它开始新的交易[开始|开始交易]
语句,自动车在之前禁用犯罪
或回滚
这使得事务变得显式。
对于DDL语句,事务自动提交,不支持回滚。如果在当前会话处于事务的过程时运行DDL语句,则在提交当前事务后执行DDL语句。
懒惰检查约束
默认情况下,乐观事务不会检查首要的关键或独特的约束执行DML语句时。改用这些检查在交易上执行犯罪
.
例如:
创建表格t1(ID㈡不零基本的钥匙);插入成t1值(1);开始乐观的;插入成t1值(1);MySQL返回错误;TiDB返回成功。插入成t1值(2);犯罪;- 它在mysql中成功致力于;TIDB返回错误,事务回滚。选择*从t1;- MySQL返回1 2;TIDB返回1。
mysql>创建表格t1(ID㈡不零基本的钥匙);查询好了那0.行做作的(0.10秒)mysql>插入成t1值(1);查询好了那1排做作的(0.02秒)mysql>开始乐观的;查询好了那0.行做作的(0.00秒)mysql>插入成t1值(1);MySQL返回错误;TiDB返回成功。查询好了那1排做作的(0.00秒)mysql>插入成t1值(2);查询好了那1排做作的(0.00秒)mysql>犯罪;- 它在mysql中成功致力于;TIDB返回错误,事务回滚。错误1062.(23000.):复制条目'1'为了关键'基本的'mysql>选择*从t1;- MySQL返回1 2;TIDB返回1。+----+|ID|+----+|1|+----+1排在放(0.01秒)
延迟检查优化通过批量约束检查和降低网络通信来提高性能。可以通过设置禁用行为tidb_constraint_check_in_place = true
.
笔记:
- 这种优化仅适用于乐观事务。
- 这种优化不会生效
插入忽略
和插入重复密钥更新
,但仅限于正常使用插入
语句。
声明回滚
TiDB支持语句执行失败后的原子回滚。如果语句导致错误,则它所做的更改将不会生效。该交易将保持开放,并且可以在发布一个犯罪
或回滚
声明。
创建表格测试(ID㈡不零基本的钥匙);开始;插入成测试值(1);插入成tset值(2);- 声明不会生效,因为“测试”被拼写为“tset”。插入成测试值(1)那(2);- 整个语句不会生效,因为它违反了主键约束插入成测试值(3.);犯罪;选择*从测试;
mysql>创建表格测试(ID㈡不零基本的钥匙);查询好了那0.行做作的(0.09秒)mysql>开始;查询好了那0.行做作的(0.00秒)mysql>插入成测试值(1);查询好了那1排做作的(0.02秒)mysql>插入成tset值(2);- 声明不会生效,因为“测试”被拼写为“tset”。错误1146.(42S02):表格'test.tyet'没有mysql> INSERT INTO test VALUES (1),(2);ERROR 1062 (23000): Duplicate entry '(重复条目)1'关键'基本的'mysql.>插入成测试值(3.);查询好了那1排做作的(0.00秒)mysql>犯罪;查询好了那0.行做作的(0.01秒)mysql>选择*从测试;+----+|ID|+----+|1||3.|+----+2行在放(0.00秒)
在上面的例子中,事务在失败后仍然是打开的插入
语句。最后一条插入语句成功,并提交更改。
交易规模限制
由于底层存储引擎的局限性,TIDB需要单行不超过6 MB。行的所有列根据其数据类型转换为字节,并总结为估计单行的大小。
TiDB支持乐观事务和悲观事务,乐观事务是悲观事务的基础。由于乐观事务首先将更改缓存到私有内存中,TiDB限制了单个事务的大小。
默认情况下,TiDB将单个事务的总大小设置为不超过100 MBtxn-total-size-limit
在配置文件中。最大值txn-total-size-limit
是10 GB。
实际的单个事务大小限制也取决于服务器可用的剩余内存量,因为执行事务时,TIDB进程的内存使用率大约是交易大小的六倍。
TIDB先前限制了单个交易的键值对的总数为300,000。在TIDB V4.0中删除了该限制。
笔记:
通常,TIDB Binlog已启用以将数据复制到下游。在某些情况下,诸如Kafka等消息中间件用于消耗复制到下游的Binlogs。
以kafka为例,Kafka的单个消息处理能力的上限为1 GB。因此,什么时候
txn-total-size-limit
设置为1 GB以上,可能发生在TIDB中成功执行事务,但下游Kafka报告错误。要避免这种情况,您需要决定实际的价值txn-total-size-limit
根据最终消费者的限制。例如,如果kafka在下游使用,txn-total-size-limit
不能超过1gb。
因果关系
笔记:
具有因果关系的事务仅在启用异步提交和单相提交功能时生效。有关两个功能的详细信息,请参阅
tidb_enable_async_commit.
和tidb_enable_1pc
.
TIDB支持实现交易的因果关系。具有因果一致性的事务,在提交时,不需要从PD获取时间戳并具有较低的提交延迟。启用因果关系的语法如下:
开始交易和因果关系仅限;
默认情况下,TIDB保证线性一致性。在线性一致性的情况下,如果在事务1之后提交事务2,则逻辑上,事务2应在事务1之后发生事务2。因果关系比线性一致性较弱。在因果一致性的情况下,只有当交易1和事务2所锁定或写入的数据具有交叉点时,才能保证两次交易的提交订单和发生阶数,这意味着这两个交易具有已知的因果关系数据库。目前,TIDB不支持通过外部因果关系。
启用了两个因果一致性的两次交易具有以下特征:
具有潜在因果关系的交易具有一致的逻辑秩序和物理提交订单
假设事务1和事务2都采用了因果关系,并执行以下陈述:
交易1 | 交易2 |
---|---|
仅以因果一致性启动事务 | 仅以因果一致性启动事务 |
x =从t中选择v,其中id = 1进行更新 | |
更新t set v = $(x + 1),其中id = 2 | |
犯罪 | |
UPDATE t SET v = 2 WHERE id = 1 | |
犯罪 |
在上面的示例中,事务1锁定ID = 1
记录和交易2修改了ID = 1
记录。因此,交易1和交易2具有潜在的因果关系。即使通过启用的因果关系,只要在交易1成功提交交易2之后,逻辑上,事务2必须在交易1之后发生。因此,事务读取交易2的修改是不可能的ID = 1
对象上不读取事务1的修改的记录ID = 2
记录。
没有因果关系的事务不能保证一致的逻辑顺序和物理提交顺序
假设的初值ID = 1
和ID = 2
都是0.
.假设事务1和事务2都采用了因果关系,并执行以下陈述:
交易1 | 交易2 | 交易3. |
---|---|---|
仅以因果一致性启动事务 | 仅以因果一致性启动事务 | |
更新T SET V = 3其中ID = 2 | ||
UPDATE t SET v = 2 WHERE id = 1 | ||
开始 | ||
犯罪 | ||
犯罪 | ||
从T中选择v(1,2) |
在上面的例子中,事务1不读取ID = 1
记录,因此交易1和事务2没有数据库已知的因果关系。对于交易启用的因果关系,即使事务2在事务1以物理时间顺序提交之后,也不保证交易2在交易1之后逻辑地发生事务2。
如果事务3在事务1提交之前开始,并且事务3读取ID = 1
和ID = 2
事务2后记录已提交,事务3可能会读取值ID = 1
是2
但是ID = 2
是0.
.
没有锁的读取不创造因果关系
假设事务1和事务2都采用了因果关系,并执行以下陈述:
交易1 | 交易2 |
---|---|
仅以因果一致性启动事务 | 仅以因果一致性启动事务 |
UPDATE t SET v = 2 WHERE id = 1 | |
从t中选择v其中id = 1 | |
更新T SET V = 3其中ID = 2 | |
犯罪 | |
犯罪 |
在上面的例子中,没有锁的读取不会创建因果关系。事务1和事务2已经创建了写倾斜。在这种情况下,如果两笔交易仍然存在因果关系,那就不合理了。因此,启用因果一致性的两个事务没有确定的逻辑顺序。