mysql事务

惊!史上最全的select加锁分析(Mysql)

狂风中的少年 提交于 2019-11-26 16:12:06
引言 大家在面试中有没遇到面试官问你下面六句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,开始回答 正文 innodb一定存在聚簇索引,默认以主键作为聚簇索引 有几个索引,就有几棵B+树(不考虑hash索引的情形)

【MySQL】存储引擎 -- 2019-08-08 21:26:54

时光毁灭记忆、已成空白 提交于 2019-11-26 14:26:20
原文: http://106.13.73.98/__/19/ 目录 #. MySQL支持的存储引擎 1. InnoDB 2. MyISAM 3. NDB 4. Memory 5. Infobright 6. NTSE 7. BLACKHOLE MySQL中的库即文件夹,表即文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制.(如:处理文本用txt类型,处理表格用excel, 处理图片 用png等) 数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎. PS:存储引擎说白了就是如何存储数据,如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库 中数据 的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型) 在Oracle和SQL Server等数据库中只有一种存储引擎,所有数据库存储管理机制都是一样的,而MySQL数据库提供了多种存储引擎,用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。 ![在这里插入图片描述](http://106.13.73.98/media/ai/2019-03/f065e887-be54-4608-a236-c400c1478427.png) SQL解释器、SQL优化器、缓冲池

【MySQL】存储引擎 -- 2019-08-08 20:39:50

自古美人都是妖i 提交于 2019-11-26 14:16:40
原文: http://106.13.73.98/__/19/ 目录 #. MySQL支持的存储引擎 1. InnoDB 2. MyISAM 3. NDB 4. Memory 5. Infobright 6. NTSE 7. BLACKHOLE MySQL中的库即文件夹,表即文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制.(如:处理文本用txt类型,处理表格用excel, 处理图片 用png等) 数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎. PS:存储引擎说白了就是如何存储数据,如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库 中数据 的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型) 在Oracle和SQL Server等数据库中只有一种存储引擎,所有数据库存储管理机制都是一样的,而MySQL数据库提供了多种存储引擎,用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。 ![在这里插入图片描述](http://106.13.73.98/media/ai/2019-03/f065e887-be54-4608-a236-c400c1478427.png) SQL解释器、SQL优化器、缓冲池

python--各种锁机制归纳整理

落爺英雄遲暮 提交于 2019-11-26 14:14:23
Q:为什么要用锁?什么样的业务场景下需要用锁? 就拿之前的工单系统来说,当审批方式为角色组审批时,代表该角色组内任意一人审批即可,这时,该角色组内成员的系统上都是可以显示审批按钮,如果此时A审批员和B审批员都同时审批了同一工单,有可能会出现不一样的审批结果,即使审批意见是一致的,多人操作也会增加对数据库的操作次数,同时也消耗了很大时间成本,用了锁机制,确保这部分是只一人在操作。 Q:你知道MySQL有哪些锁? 悲观锁、乐观锁 排它锁、共享锁 行级锁、表级锁 悲观锁:对每次访问数据库的操作都是抱有悲观的态度,认为该操作会对数据库做出修改,所以在访问数据库的时候就加了锁 乐观锁:对每次访问数据库的操作都抱有乐观的态度,只有在做出修改的时候才会上锁 排它锁:也称为写锁,若事务A对数据A上了写锁,那么此时只允许事务A对数据A进行读和写的操作,不允许数据A再接受其他的锁,直到排它锁释放之后 共享锁:也称为读锁,若事务A对数据A上了读锁,那么此时事务A只能读取数据A并不能对其修改,也能接受其他事务对数据A的读锁 mysql数据库引擎:MyISAM 和 InnoDB MyISAM 采用表级锁,不支持事务 InnoDB 默认行级锁,也支持表级锁 行级锁:如根据主键id字段进行查找,并且查找到数据,主键字段就产生了行级锁 表级锁:根据非主键非索引字段进行查找,并且查找到数据,当前查找字段产生表级锁

Spring 中的事务传播行为

三世轮回 提交于 2019-11-26 13:36:54
背景介绍 Spring 框架应该是每一个人 javaer 都必须接触和学习的技术,Spring 公司所提供的各种框架是 Java 开发行业可参考的重要标准之一。 Spring 中有 7 种类型的事务传播行为。事务传播行为是 Spring 框架提供的一种事务管理方式,它是 Spring 框架之中非常重要的一个技术点,毕竟事务关系到应用程序和数据库的交互,而数据更是互联网行业最为重要的资源。 平时开发过程中事务都会有使用,但是没有真正地总结过,尤其是事务中嵌套事务的场景,此篇基础知识文在此做一个简单的学习总结, 事务 事务的特征 事务的隔离级别 mysql 默认的事务隔离级别是 repeatable_read Spring 事务的传播行为 代码演示 准备动作:新建一个 spring 项目,数据库脚本见: SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for customer -- ---------------------------- DROP TABLE IF EXISTS `customer`; CREATE TABLE `customer` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name

设置mysql 事务锁超时时间 innodb_lock_wait_timeout

孤街浪徒 提交于 2019-11-26 13:26:31
Mysql数据库采用InnoDB模式,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错。 mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait_timeout'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | innodb_lock_wait_timeout | 50 | +--------------------------+-------+ 1 row in set (0.00 sec) 郑州不孕不育医院哪家好:http://jbk.39.net/yiyuanzaixian/zztjyy/ mysql> SET GLOBAL innodb_lock_wait_timeout=120; Query OK, 0 rows affected (0.00 sec) mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait_timeout'; +--------------------------+-------+ | Variable_name | Value | +-

Mysql隔离性之Undo Log

匆匆过客 提交于 2019-11-26 13:00:42
Mysql隔离性之Undo Log InnoDB行记录有三个隐藏字段:分别对应的行的rowid、事务号db_trx_id和回滚指针db_roll_ptr,其中db_trx_id表示最近修改的事务的id,db_roll_ptr指向回滚段中的undo log。 根据行为不同,可以分为两种:insert undo log 和 update undo log insert undo log: 在insert操作中产生undo log,因为insert操作的记录只对事务本身可见,rollback在该事务中直接删除,不需要进行purge操作。 update undo log: 在update or delete操作中产生undo log,因为会对已存在的记录产生影响,rollback MVCC机制会找它的历史版本进行恢复。 在update or delete操作中产生undo log,因为会对已存在的记录产生影响,为了提供MVCC机制,因此update undo log不能在事务提交的时候删除,而是在事务提交时,把事务放入histroy list上,等待purge线程进行最后的删除操作。 如下图所示(初始状态): 当事务 2 使用 UPDATE 语句修改该行数据时,会首先使用排他锁锁定改行,将该行当前的值复制到 undo log 中,然后再真正地修改当前行的值,最后填写事务 ID

Mysql隔离性之事务链表

╄→尐↘猪︶ㄣ 提交于 2019-11-26 13:00:36
Mysql隔离性之事务链表 Mysql中的事务在开始到提交过程中,都会被保存到一个叫trx_sys链表中,这是一个基本链表结构: ct-trxàtrx11àtrx9àtrx6àtrx5àtrx3 事务链表中保存的都是还未提交的事务,事务一旦被提交,则会从事务链表中摘除。 RR隔离级别下,在每个事务开始的时候,会将当前系统中所有活跃事务拷贝到一个列表中(read view) RC隔离级别下,在每条语句开始的时候,会将当前系统中活跃事务拷贝到一个列表中(read view) 查看事务列表: show engine innodb status; 欲知后事(Mysql隔离性之Read View),请点击这里喔! 来源: https://blog.csdn.net/longgeqiaojie304/article/details/98872743

Mysql隔离性之Read View

六眼飞鱼酱① 提交于 2019-11-26 12:59:55
Mysql隔离性之Read View 当前事务能读取到哪个历史版本? Read View是事务开启时,当前所有事务的一个集合,这个数据结构中存储了当前Read View中最大的ID及最小的ID。 这就是当前活跃事务列表,如下所示: ct-trx --> trx11 --> trx9 --> trx6 --> trx5 --> trx3; ct-trx 表示当前事务的 id ,对应上面的 read_view 数据结构如下, read_view -> creator_trx_id = ct - trx ; read_view -> up_limit_id = trx3 ; 低水位 read_view -> low_limit_id = trx11 ; 高水位 read_view -> trx_ids = [ trx11 , trx9 , trx6 , trx5 , trx3 ]; low_limit_id 是 “ 高水位 ” ,即当时活跃事务的最大 id ,如果读到 row 的 db_trx_id>=low_limit_id ,说明这些 id 在此之前的数据都没有提交,如注释中的描述,这些数据都不可见。 if ( trx_id >= view -> low_limit_id ) { return ( FALSE ); } 注: readview 部分源码 up_limit_id 是 “

Mysql隔离性之并发问题

*爱你&永不变心* 提交于 2019-11-26 12:51:28
Mysql隔离性之并发问题 在事务并发的操作中可能会出现一些问题: 丢失更新: 两个事务针对同一数据都发生修改操作时,会存在丢失更新。 脏读: 一个事务读取到另一个事务未提交的数据。 不可重复读: 一个事务因读取到另一个事务已提交的update或者delete数据。导致对同一记录读取两次以上的结果不一致。 幻读: 一个事务因读取到另一个事务已提交的insert数据。导致对同一张表读取两次及以上的结果不一致。 欲知后事(事务隔离性之隔离级别),请点击这里喔! 来源: https://blog.csdn.net/longgeqiaojie304/article/details/98870413