mysql和tidb在snapshot隔离级别上的区别(代码片段)

adream307 adream307     2022-12-06     351

关键词:

如果一个事务包含多条 SQL 语句,在 snapshot 隔离级别上,mysql 并不是事务开始的时候获得一个 snapshot 而是在执行第一条 SQL 语句的时候获得 snapshot 的; 而 TiDB 是在事务开始的时候获得一个 snapshot

参考 https://pingcap.com/blog-cn/tikv-source-code-reading-12/ TiDB 在事务开始的时候从 PD 获得一个 start_TS,这个 start_TS 就标记一个 snapshot

启动 mysql

docker run --rm  --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306  mysql:5.6

测试 mysql

client 1

$ mysql --user=root --password=123456  --port=3306 --host=127.0.0.1

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> use test;
Database changed
mysql> create table t1(a int);
Query OK, 0 rows affected (0.04 sec)

mysql> insert into t1 values(1);
Query OK, 1 row affected (0.02 sec)

mysql> select * from t1;
+------+
| a    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> 

client 2

$ mysql --user=root --password=123456  --port=3306 --host=127.0.0.1

mysql> use test;
Database changed
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> 

client 1

mysql> create table t2(b int);
Query OK, 0 rows affected (0.03 sec)

mysql> select * from t2;
+------+
| b    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> 

client 2

mysql> select * from t2;
+------+
| b    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.01 sec)

client 1

mysql> create table t3(a int);
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t3 values(1);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t3;
+------+
| a    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

client 2

mysql> select * from t3;
ERROR 1412 (HY000): Table definition has changed, please retry transaction

client 2

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t3;
+------+
| a    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

启动 TiDB

docker-compose.yml

version: '3.5'

services:
 pd0:
   image: pingcap/pd:latest
   ports:
     - "2379:2379"
     - "2380:2380"
   volumes:
     - /etc/localtime:/etc/localtime:ro
   command:
     - --name=pd0
     - --client-urls=http://0.0.0.0:2379
     - --peer-urls=http://0.0.0.0:2380
     - --advertise-client-urls=http://pd0:2379
     - --advertise-peer-urls=http://pd0:2380
     - --initial-cluster=pd0=http://pd0:2380
     - --data-dir=/data/pd0
     - --log-file=/logs/pd0.log

 tikv0:
   image: pingcap/tikv:latest
   ports:
     - "20160:20160"
   volumes:
     - /etc/localtime:/etc/localtime:ro
   command:
     - --addr=0.0.0.0:20160
     - --advertise-addr=tikv0:20160
     - --data-dir=/data/tikv0
     - --pd=pd0:2379
     - --log-file=/logs/tikv0.log
   depends_on:
     - "pd0"

 tikdb0:
   image: pingcap/tidb:latest
   ports:
     - "4001:4000"
   volumes:
     - /etc/localtime:/etc/localtime:ro
   command:
     - --store=tikv
     - --path=pd0:2379
     - --P=4000
   depends_on:
     - "tikv0"

 tikdb1:
   image: pingcap/tidb:latest
   ports:
     - "4002:4000"
   volumes:
     - /etc/localtime:/etc/localtime:ro
   command:
     - --store=tikv
     - --path=pd0:2379
     - --P=4000
   depends_on:
     - "tikv0"

启动 TiDB

docker-compose up -d

测试 TiDB

client 1

$ mysql -h 127.0.0.1 -P 4001 -u root

mysql> use test
Database changed
mysql> create table t1(a int);
Query OK, 0 rows affected (0.14 sec)

mysql> insert into t1 values(1);
Query OK, 1 row affected (0.04 sec)

mysql> select * from t1;
+------+
| a    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> 

client 2

$ mysql -h 127.0.0.1 -P 4001 -u root
mysql> use test;
Database changed
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> 

client 1

mysql> create table t2(a int);
Query OK, 0 rows affected (0.14 sec)

mysql> insert into t2 values(1);
Query OK, 1 row affected (0.04 sec)

mysql> select * from t2;
+------+
| a    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> 

client 2

mysql> select * from t2;
ERROR 1146 (42S02): Table 'test.t2' doesn't exist

client 2

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t2;
+------+
| a    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> 

mysql事务的隔离级别和acid

在MySQL中隔离性有4种级别,read-uncommitted(读未提交;会产生脏读,不可重复读,幻读)在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读... 查看详情

mysql原理篇之事务隔离级别和mvcc--13(代码片段)

Mysql原理篇之事务隔离级别和MVCC--13事前准备事务隔离级别事务并发执行遇到的问题SQL标准中的四种隔离级别MySQL中支持的四种隔离级别如何设置事务的隔离级别MVCC原理版本链ReadViewREADCOMMITTED——每次读取数据前都生成一个ReadView... 查看详情

mysql的事务隔离级别及各个隔离级别应用场景,详细

...。希望此文能从需求、现状和解决方式的角度帮大家理解隔离级别。隔离级别的产生在串型执行的条件下,数据修改的顺序是固定的、可预期的结果,但是并发执行的情况下,数据的修改是不可预期的,也不固定,为了实现数据... 查看详情

mysql事务和隔离级别

MySQL事务和隔离级别连接管理器: 接受请求 创建线程 认证用户 建立安全连接 并发控制: 最简单机制是使用锁 多版本并发控制:MVCC(使用其他机制)锁: 读锁:共享锁 写锁:独占锁 加锁: LOCKTABLEStb_name{READ|WRITE}; 解锁: UNL... 查看详情

高频|mysql事务隔离级别和锁的机制可以这么答

案例背景MySQL隔离级别案例分析案例解答死锁产生的四个必要条件:案例背景MySQL的事务隔离级别(IsolationLevel),是指:当多个线程操作数据库时,数据库要负责隔离操作,来保证各个线程在获取数据时的... 查看详情

为啥快照隔离级别默认关闭?

】为啥快照隔离级别默认关闭?【英文标题】:Whyissnapshotisolationleveloffbydefault?为什么快照隔离级别默认关闭?【发布时间】:2016-01-2608:57:03【问题描述】:在MSSQLServer中,要运行SNAPSHOT隔离级别的事务,首先需要在数据库级别开... 查看详情

mysql事务隔离级别的实现原理

文章目录一、什么是事务的隔离级别二、再看可重复读原理锁定读(当前读)一致性非锁定读(快照读)隐式锁定(两阶段锁)显式锁定三、总结一、什么是事务的隔离级别在数据库系统中,一个事务是指:由一系列数据库操作... 查看详情

再谈数据库隔离级别

前言在“数据库事务和事务的隔离级别”一文中,事务的隔离级别有如下4中隔离级别,1.未授权读取,readuncommited2.授权读取,readcommited3.可重复读取,repeatableread4.串行化,serializable 这次我以mysql为例,通过实际操作演... 查看详情

如何将 MySQL 中的 InnoDB 设置为快照隔离级别

】如何将MySQL中的InnoDB设置为快照隔离级别【英文标题】:HowtosetInnoDBinMySQLtothesnapshotisolationlevel【发布时间】:2012-03-2622:03:40【问题描述】:我现在正在从事一个学校项目,该项目需要描述MySQL在不同隔离级别方面的性能。我已... 查看详情

如何查看mysql数据库隔离级别

...。希望此文能从需求、现状和解决方式的角度帮大家理解隔离级别。隔离级别的产生在串型执行的条件下,数据修改的顺序是固定的、可预期的结果,但是并发执行的情况下,数据的修改是不可预期的,也不固定,为了实现数据... 查看详情

mysql事务隔离级别(代码片段)

MySQL的四种隔离级别读未提交读提交可重复读串行化隔离级别可以通过MySQL的视图来实现。读未提交读未提交是一个事务仅修改了数据但还未提交时,本次修改可以便可被其他事务查询到变更后的值。读未提交隔离级别下࿰... 查看详情

记一个mysql环境rr隔离级别转换成rc的问题

先了解RR(REPEATABLE-READ)和RC(READ-COMMITTED)的区别.RR隔离级别增加了间隙锁,避免了幻读,并且阻止了不可重复读,让同一个事务里面的查询和修改都是一致的.mysql默认的隔离级别就是RR.虽然说RC隔离级别在同一个事务内会存在查询出不同... 查看详情

数据库事务的四个隔离级别,mysql在哪一个级别

...。希望此文能从需求、现状和解决方式的角度帮大家理解隔离级别。隔离级别的产生在串型执行的条件下,数据修改的顺序是固定的、可预期的结果,但是并发执行的情况下,数据的修改是不可预期的,也不固定,为了实现数据... 查看详情

mysql数据库的事务和mysql隔离级别分析(代码片段)

...少少也知道其中的一些事情。今天着重聊聊MySQL中事务的隔离级别。上车上车……文章目录一、什么是事务?二、MySQL中的事务和隔离级别1、读取未提交内容(ReadUncommitted)2、读取已提交内容(ReadCommitted)3、... 查看详情

mysql的隔离级别和锁的关系

  MySql的隔离级别和锁的关系 一、事务的4个基本特征 Atomic(原子性): 事务中包括的操作被看做一个逻辑单元。这个逻辑单元中的操作要 么所有成功。要么所有失败。 Consistency(一致性): 仅仅... 查看详情

mysql的事务和引擎,注意细品(代码片段)

...1、ACID特点2、数据不一致产生的结果:(三)、事务的隔离1、MySQL事物隔离级别1.1查询全局事务隔离级别1.2查询会话事务隔离级别1.3设置全局事务隔离级别1.4设置会话事务隔离级别(四)事务控制语句1 查看详情

mysql数据库事务的隔离级别和锁的实现原理分析

mysql数据库的事务隔离级别相信很多同学都知道.大家有没有想过它是如何实现的呢?带着这些问题我翻阅了相关数据库的书籍和资料,把我的理解写下来.一:事务隔离级别mysql数据库的隔离界别如下:1,READUNCOMMITTED(未提交读)事务... 查看详情

mysql是如何实现四大隔离级别的

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。ReadUncommitted(读取未提交内容)在该隔离级别,... 查看详情