当前位置:网站首页>TiDB的事务概览
TiDB的事务概览
2022-06-27 06:08:00 【添香小铺】
TiDB 支持完整的分布式事务,提供乐观事务与悲观事务(TiDB 3.0 中引入)两种事务模型。本文主要介绍涉及到事务的语句、乐观事务和悲观事务、事务的隔离级别,以及乐观事务应用端重试和错误处理。
通用语句
本章介绍在 TiDB 中如何使用事务。 将使用下面的示例来演示一个简单事务的控制流程:
Bob 要给 Alice 转账 20 元钱,当中至少包括两个操作:
- Bob 账户减少 20 元。
- Alice 账户增加 20 元。
事务可以确保以上两个操作要么都执行成功,要么都执行失败,不会出现钱平白消失或出现的情况。
使用 bookshop 数据库中的 users
表,在表中插入一些示例数据:
INSERT INTO users (id, nickname, balance) VALUES (2, 'Bob', 200); INSERT INTO users (id, nickname, balance) VALUES (1, 'Alice', 100);
现在,运行以下事务并解释每个语句的含义:
BEGIN; UPDATE users SET balance = balance - 20 WHERE nickname = 'Bob'; UPDATE users SET balance = balance + 20 WHERE nickname= 'Alice'; COMMIT;
上述事务成功后,表应如下所示:
+----+--------------+---------+ | id | account_name | balance | +----+--------------+---------+ | 1 | Alice | 120.00 | | 2 | Bob | 180.00 | +----+--------------+---------+
开启事务
要显式地开启一个新事务,既可以使用 BEGIN
语句,也可以使用 START TRANSACTION
语句,两者效果相同。语法:
BEGIN;
START TRANSACTION;
TiDB 的默认事务模式是悲观事务,你也可以明确指定开启乐观事务:
BEGIN OPTIMISTIC;
开启悲观事务:
BEGIN PESSIMISTIC;
如果执行以上语句时,当前 Session 正处于一个事务的中间过程,那么系统会先自动提交当前事务,再开启一个新的事务。
提交事务
COMMIT
语句用于提交 TiDB 在当前事务中进行的所有修改。语法:
COMMIT;
启用乐观事务前,请确保应用程序可正确处理 COMMIT
语句可能返回的错误。如果不确定应用程序将会如何处理,建议改为使用悲观事务。
回滚事务
ROLLBACK
语句用于回滚并撤销当前事务的所有修改。语法:
ROLLBACK;
回到之前转账示例,使用 ROLLBACK
回滚整个事务之后,Alice 和 Bob 的余额都未发生改变,当前事务的所有修改一起被取消。
TRUNCATE TABLE `users`; INSERT INTO `users` (`id`, `nickname`, `balance`) VALUES (1, 'Alice', 100), (2, 'Bob', 200); SELECT * FROM `users`; +----+--------------+---------+ | id | nickname | balance | +----+--------------+---------+ | 1 | Alice | 100.00 | | 2 | Bob | 200.00 | +----+--------------+---------+ BEGIN; UPDATE `users` SET `balance` = `balance` - 20 WHERE `nickname`='Bob'; UPDATE `users` SET `balance` = `balance` + 20 WHERE `nickname`='Alice'; ROLLBACK; SELECT * FROM `users`; +----+--------------+---------+ | id | nickname | balance | +----+--------------+---------+ | 1 | Alice | 100.00 | | 2 | Bob | 200.00 | +----+--------------+---------+
如果客户端连接中止或关闭,也会自动回滚该事务。
事务隔离级别
事务隔离级别是数据库事务处理的基础,ACID 中的 “I”,即 Isolation,指的就是事务的隔离性。
SQL-92 标准定义了 4 种隔离级别:读未提交 (READ UNCOMMITTED
)、读已提交 (READ COMMITTED
)、可重复读 (REPEATABLE READ
)、串行化 (SERIALIZABLE
)。详见下表:
Isolation Level | Dirty Write | Dirty Read | Fuzzy Read | Phantom |
---|---|---|---|---|
READ UNCOMMITTED | Not Possible | Possible | Possible | Possible |
READ COMMITTED | Not Possible | Not possible | Possible | Possible |
REPEATABLE READ | Not Possible | Not possible | Not possible | Possible |
SERIALIZABLE | Not Possible | Not possible | Not possible | Not possible |
TiDB 语法上支持设置 READ COMMITTED
和 REPEATABLE READ
两种隔离级别:
mysql> SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; ERROR 8048 (HY000): The isolation level 'READ-UNCOMMITTED' is not supported. Set tidb_skip_isolation_level_check=1 to skip this error mysql> SET TRANSACTION ISOLATION LEVEL READ COMMITTED; Query OK, 0 rows affected (0.00 sec) mysql> SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; Query OK, 0 rows affected (0.00 sec) mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; ERROR 8048 (HY000): The isolation level 'SERIALIZABLE' is not supported. Set tidb_skip_isolation_level_check=1 to skip this error
TiDB 实现了快照隔离 (Snapshot Isolation, SI) 级别的一致性。为与 MySQL 保持一致,又称其为“可重复读”。该隔离级别不同于 ANSI 可重复读隔离级别 和 MySQL 可重复读隔离级别。更多细节请阅读 TiDB 事务隔离级别。
边栏推荐
- 信息系统项目管理师---第七章 项目成本管理
- 《汇编语言-王爽》第3章笔记及实验
- Configuration of vscode korofileheader
- MATLAB快速将影像的二维坐标转换为经纬度坐标
- Us camera cloud service scheme: designed for lightweight video production scenes
- What's new in redis4.0 - active memory defragmentation
- 426-二叉树(513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树、654. 最大二叉树)
- Assembly language - Wang Shuang Chapter 3 notes and experiments
- 【QT小点】实现看门狗功能,检测外部程序是否在运行
- 【Cocos Creator 3.5.1】input.on的使用
猜你喜欢
Yaml file encryption
openstack实例重启状态就会变成错误处理方法,容器搭建的openstack重启计算节点compute服务方法,开机提示Give root password for maintenance处理方法
JVM object composition and storage
KubeSphere 集群配置 NFS 存储解决方案-收藏版
Multithreading basic Part3
Formation and release of function stack frame
The restart status of the openstack instance will change to the error handling method. The openstack built by the container restarts the compute service method of the computing node and prompts the gi
Senior [Software Test Engineer] learning route and necessary knowledge points
cpu-z中如何查看内存的频率和内存插槽的个数?
Gaussian distribution, linear regression, logistic regression
随机推荐
JVM对象组成和存储
Change the status to the corresponding text during MySQL query
TiDB 数据库快速上手指南
Multithreading basic Part3
vscode korofileheader 的配置
Unicast, multicast and broadcast of IP network communication
JVM object composition and storage
WebRTC系列-網絡傳輸之7-ICE補充之提名(nomination)與ICE_Model
【Cocos Creator 3.5.1】event.getButton()的使用
Keep 2 decimal places after multiplying SQLSEVER fields
Software testing year end summary report template
Kubesphere cluster configuration NFS storage solution - favorite
yaml文件加密
Crawler learning 5--- anti crawling identification picture verification code (ddddocr and pyteseract measured effect)
线程间等待与唤醒机制、单例模式、阻塞队列、定时器
我对于测试团队建设的意见
Run opcua protocol demo on raspberry pie 4B to access kubeedge
Built in functions of spark
使用CSDN 开发云搭建导航网站
日期 数据库日期 字符串 之间互相转换