关键词:
如果一个事务包含多条 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(读取未提交内容)在该隔离级别,... 查看详情