TiDB作为新一代分布式SQL数据库,它支持强一致性事务。ANSI SQL-92 对于事务的隔离级别有明确的定义,这也是大部分传统数据库(MySQL、PostgreSQL、Oracle、DB2、SqlServer等)都遵循的标准。TiDB的事务隔离级别并没有完全支持ANSI标准中的所有隔离级别,它缺省的隔离级别是"Snapshot Isolation"(简称SI),这种隔离级别类似于 ANSI 标准中的 "可重复读"(简称RR),但是与它又不完全相同:RR会发生“幻像读”,SI不会发生;RR不会发生“写偏斜(write skew)”,而SI会发生。准确理解TiDB的事务隔离级别是非常重要的,特别对于应用开发人员来说,如果不了解TiDB事务隔离级别的特点以及"乐观锁"的特点,那么就无法开发出正确的应用。下面将结合一些例子对TiDB的SI隔离级别和乐观锁机制进行详细的说明,希望对大家能有所帮助。
1. 创建示例数据库和示例表
这里使用的TiDB环境,假设用户已经阅读过本人写的文章“使用Docker Compose快速搭建一个单机TiDB集群”。为了很好的理解这些例子,希望大家能动手试一试。
(1) 使用mysql client连接到TiDB
mysql -h 127.0.0.1 -P 4000 -u root
(2) 创建数据库
create database bankdb;
(3) 创建用户表
create table account ( id int, name varchar(8), balance decimal, primary key (id) );
(4) 插入示例数据
insert into account values(1,'user1',100) , (2,'user2',100);
2. SI隔离级别不会发生"幻像读"
事务1 事务2
begin;