mysql事务

mysql多表查询&&事务

岁酱吖の 提交于 2019-11-29 08:27:26
# 今日内容 1. 多表查询 2. 事务 3. DCL ## 多表查询: * 查询语法: select 列名列表 from 表名列表 where.... * 准备sql # 创建部门表 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部'); # 创建员工表 CREATE TABLE emp ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), gender CHAR(1), -- 性别 salary DOUBLE, -- 工资 join_date DATE, -- 入职日期 dept_id INT, FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键,关联部门表(部门表的主键) ); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1); INSERT INTO emp(NAME,gender,salary,join_date,dept_id)

Mysql加锁过程详解(8)-理解innodb的锁(record,gap,Next-Key lock)

放肆的年华 提交于 2019-11-29 08:15:48
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select for update/lock in share mode 对事务并发性影响 Mysql加锁过程详解(5)-innodb 多版本并发控制原理详解 Mysql加锁过程详解(6)-数据库隔离级别(1) Mysql加锁过程详解(6)-数据库隔离级别(2)-通过例子理解事务的4种隔离级别 Mysql加锁过程详解(7)-初步理解MySQL的gap锁 Mysql加锁过程详解(8)-理解innodb的锁(record,gap,Next-Key lock) Record lock 单条索引记录上加锁, record lock锁住的永远是索引,而非记录本身,即使该表上没有任何索引,那么innodb会在后台创建一个隐藏的聚集主键索引 ,那么锁住的就是这个隐藏的聚集主键索引。 所以说当一条sql没有走任何索引时,那么将会在每一条聚集索引后面加X锁,这个类似于表锁 ,但原理上和表锁应该是完全不同的。 Gap lock 在索引记录之间的间隙中加锁 ,或者是在某一条索引记录之前或者之后加锁, 并不包括该索引记录本身 。gap lock的机制主要是解决可重复读模式下的幻读问题,关于幻读的演示和gap锁如何解决了幻读

Mysql加锁过程详解(8)-理解innodb的锁(record,gap,Next-Key lock)

二次信任 提交于 2019-11-29 08:15:34
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select for update/lock in share mode 对事务并发性影响 Mysql加锁过程详解(5)-innodb 多版本并发控制原理详解 Mysql加锁过程详解(6)-数据库隔离级别(1) Mysql加锁过程详解(6)-数据库隔离级别(2)-通过例子理解事务的4种隔离级别 Mysql加锁过程详解(7)-初步理解MySQL的gap锁 Mysql加锁过程详解(8)-理解innodb的锁(record,gap,Next-Key lock) 首先,mysql 幻读并非是”一个事务内进行两次相同操作居然得到了不一样的结果”,因为它根本不可能发生在使用了 read view / MVCC 的 RR 隔离级别下,这种幻读的定义更适合给 Oracle,Oracle 的事务隔离只有两级,RC 和 Serializable。然后还有很多人辩解说不可重复读是针对某条记录的,幻读是针对记录集合的,这是在自我安慰么? 这里给出 mysql 幻读的比较形象的场景: users: id 主键 1、T1:select * from users where id = 1; 2、T2:insert into

MySQL存储引擎

二次信任 提交于 2019-11-29 08:15:05
MySQL存储引擎 MySQL的存储引擎 存储引擎sql语句: 查看当前的默认存储引擎: mysql> show variables like "default_storage_engine"; 查询当前数据库支持的存储引擎 mysql> show engines \G; 常用引擎适用场景: InnoDB 用于事务处理应用程序,支持外键和行级锁。如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包括很多更新和删除操作,那么InnoDB存储引擎是比较合适的。InnoDB除了有效的降低由删除和更新导致的锁定,还可以确保事务的完整提交和回滚,对于类似计费系统或者财务系统等对数据准确要求性比较高的系统都是合适的选择。 MyISAM 如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高,那么可以选择这个存储引擎。 Memory 将所有的数据保存在内存中,在需要快速定位记录和其他类似数据的环境下,可以提供极快的访问。Memory的缺陷是对表的大小有限制,虽然数据库因为异常终止的话数据可以正常恢复,但是一旦数据库关闭,存储在内存中的数据都会丢失。 不同的存储模式: 数据存在硬盘上,存三个文件,存表结构、数据、搜索目录; 数据存在硬盘上、存两个文件,表结构存一个文件,数据和搜索目录存一个文件; 数据存在内存中

MySQL InnoDB事务,锁机制

大兔子大兔子 提交于 2019-11-29 08:13:03
MVCC:Snapshot Read vs Current Read MySQL InnoDB存储引擎,实现的是基于多版本的并发控制协议——MVCC ( Multi-Version Concurrency Control ) (注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)。MVCC最大的好处,相信也是耳熟能详:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能,这也是为什么现阶段,几乎所有的RDBMS,都支持了MVCC。 在MVCC并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read)。快照读,读取的是记录的可见版本 (有可能是历史版本),不用加锁。当前读,读取的是记录的最新版本,并且,当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录。 Innodb锁问题 InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题。下面我们先介绍一点背景知识,然后详细讨论InnoDB的锁问题。 InnoDB实现了以下两种类型的行锁。 l 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

mysql InnoDB加锁分析

一笑奈何 提交于 2019-11-29 08:12:52
文章转载自: http://www.fanyilun.me/2017/04/20/MySQL%E5%8A%A0%E9%94%81%E5%88%86%E6%9E%90/ 以下实验数据基于MySQL 5.7。 假设已知一张表my_table,id列为主键 id name num 1 aaa 100 5 bbb 200 8 bbb 300 10 ccc 400 1. 查询命中聚簇索引(主键索引) 1.1 如果是精确查询,那么会在命中的索引上加record lock // 在id=1的聚簇索引上加X锁 update my_table set name='a' where id=1; // 在id=1的聚簇索引上加S锁 select * from my_table where id=1 lock in share mode; 1.2 如果是范围查询,那么 1.2.1 在RC隔离级别下,会在所有命中的行的聚簇索引上加record locks(只锁行) // 在id=8和10的聚簇索引上加X锁 update my_table set name='a' where id>7; // 在id=1的聚簇索引上加X锁 update my_table set name='a' where id<=1; 1.2.2 在RR隔离级别下,会在所有命中的行的聚簇索引上加next-key locks(锁住行和间隙)

30 答疑文章二,用动态的观点看加锁

人盡茶涼 提交于 2019-11-29 08:12:34
答疑文章二,用动态的观点看加锁 回顾加锁原则 : 原则 1 :加锁的基本单位是 next-key lock , 是一个 前开后闭 区间 原则 2 :查找过程中 访问到的对象 才加锁 优化 1 :索引上的等值查询,给唯一索引加锁的时候, next-key lock 退化为 行锁 优化 2 :索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候, next-key lock 退化为 间隙锁 一个 bug :给唯一索引上的范围查询会访问到不满足条件的第一个值为止。 CREATE TABLE `t30` ( `id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `c` (`c`) ) ENGINE=InnoDB; insert into t30 values(0,0,0),(5,5,5), (10,10,10),(15,15,15),(20,20,20),(25,25,25); 不等号条件里的等值查询 等值查询和遍历的区别,为什么在不等查询里面,这个过程也有等值查询? begin; select * from t30 where id>9 and id<12 order by id desc for update; 利用上面的加锁规则

Mysql的select加锁分析

若如初见. 提交于 2019-11-29 08:12:01
引言 大家在面试中有没遇到面试官问你下面六句Sql的区别呢 select * from table where id = ? select * from table where id < ? select * from table where id = ? lock in share mode select * from table where id < ? lock in share mode select * from table where id = ? for update select * from table where id < ? for update 如果你能清楚的说出,这六句sql在不同的事务隔离级别下,是否加锁,加的是共享锁还是排他锁,是否存在间隙锁,那这篇文章就没有看的意义了。 之所以写这篇文章是因为目前为止网上这方面的文章太片面,都只说了一半,且大多没指明隔离级别,以及 where 后跟的是否为索引条件列。在此,我就不一一列举那些有误的文章了,大家可以自行百度一下,大多都是讲不清楚。 OK,要回答这个问题,先问自己三个问题 当前事务隔离级别是什么 id列是否存在索引 如果存在索引是聚簇索引还是非聚簇索引呢? OK,开始回答 正文 本文假定读者,看过我的 《MySQL(Innodb)索引的原理》 。如果没看过,额,你记得三句话吧 innodb一定存在聚簇索引

Python3 操作Mysql数据库

你。 提交于 2019-11-29 07:56:31
Pymysql介绍 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,而Python2中则使用mysqldb。 PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。 通用步骤: 1.引入模块 2.获取与数据库的连接 3.执行SQL语句和存储过程 4.关闭数据库连接 PyMySQL 安装 1.打开cmd命令 cd C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts #切换目录 pip install pymysql 数据库连接 import pymysql #模块导入 #打开数据库连接 db = pymysql.connect( host='数据库ip', user='用户名, passwd='密码', db='数据库名', port=3306, charset='utf8' ) #使用 cursor() 方法创建一个游标对象 cursor cursor = db.cursor() #使用 execute() 方法执行 SQL 查询 cursor.execute("SELECT VERSION()") #使用 fetchone() 方法获取单条数据. data = cursor

mysql 主从复制原理

喜欢而已 提交于 2019-11-29 07:55:21
主从形式 mysql主从复制 灵活 一主一从 主主复制 一主多从---扩展系统读取的性能,因为读是在从库读取的; 多主一从---5.7开始支持 联级复制--- 用途及条件 mysql主从复制用途 实时灾备,用于故障切换 读写分离,提供查询服务 备份,避免影响业务 主从部署必要条件: 主库开启binlog日志(设置log-bin参数) 主从server-id不同 从库服务器能连通主库 主从原理 mysql主从复制原理 从库生成两个线程,一个I/O线程,一个SQL线程; i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中; 主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog; SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致; 问题及解决方法 mysql主从复制存在的问题: 主库宕机后,数据可能丢失 从库只有一个sql Thread,主库写压力大,复制很可能延时 解决方法: 半同步复制---解决数据丢失的问题 并行复制----解决从库复制延迟的问题 半同步复制 mysql semi-sync(半同步复制) 半同步复制: 5.5集成到mysql,以插件的形式存在,需要单独安装 确保事务提交后binlog至少传输到一个从库