mysql 开发进阶篇系列 6 锁问题(事务与隔离级别介绍)
一.概述
在数据库中,数据是属于共享资源,为了保证并发访问的一致性,有效性,产生了锁。接下来重点讨论mysql锁机制的特点,常见的锁问题,以及解决mysql锁问题的一些方法或建议。 相比其他数据库,mysql 锁机制比较简单,显著的特点是:不同的存储引擎支持不同的锁机制。在innodb中支持行锁和表锁,默认行锁。
mysql 的三种锁归纳如下:
表级锁:开销小,加锁快,不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度最高。
页面锁:开销和加锁时间界于表锁和行锁之间,会出现死锁,并发度一般。
在不同sql语句执行,会采用不同的锁,由mysql 内部自动加锁,解锁,以及对应的锁类型。重点介绍mysql表锁和innodb行锁。由于MyisAm将被innodb取代了,后面重点讲innodb。
1. 事务介绍
innodb的二个特点是:1是支持事务,2是采用行级锁。但事务的引入也带来了一些新问题,先介绍一下背景知识。
1.1 事务及其属性ACID
事务是同一组sql语句组成的逻辑处理单元,具有原子性,一致性,隔离性,持久性。
1.2 并发事务处理带来的问题
更新丢失,脏读,不可重复读,幻读。
1.3 事务隔离级别
由于并发事务处理带来的问题,那么解决方法就是对应不同的事务隔离级别。 数据库实现事务隔离的方式,基本上分为以下两种:
(1)一种是在读取数据前,对其加锁,阻止其他事务对数据进行修改。
(2)另一种是不用加任何锁,通过快照 Snapshot 形式的 “数据版本并发控制” (MultiVersion Concurrency Control)简称MVCC。
数据库的事务隔离级别越严格,并发副作用越小,付出的代价也就越大,因为实质上就是使事务在一定程度上"串行化"进行,这与"并发"是矛盾的。
下面是四种隔离级别:

2. 隔离级别查看
-- 查看事务隔离级别,默认是REPEATABLE-READ,在sql server里默认是Read Committed
SELECT @@tx_isolation

关于事务,事务并发问题,事务隔离级别,它们的原理这里有详细介绍“sql server 锁与事务拨云见日”。(未完)
mysql 开发进阶篇系列 6 锁问题(事务与隔离级别介绍)的更多相关文章
- mysql 开发进阶篇系列 10 锁问题 (相同索引键值或同一行或间隙锁的冲突)
1.使用相同索引键值的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例如:city表city_ ...
- mysql 开发进阶篇系列 14 锁问题(避免死锁,死锁查看分析)
一. 概述 通常来说,死锁都是应用设计问题,通过调整业务流程,数据库对象设计,事务大小,以及访问数据库的sql语句,绝大部分死锁都可以避免,下面介绍几种避免死锁的常用 方法. 1. 在应用中,如果不同 ...
- mysql 开发进阶篇系列 15 锁问题 (总结)
1. innodb 行锁是基于索引实现的,如果不通过索引访问数据,innodb会使用表锁. http://www.cnblogs.com/MrHSR/p/9376086.html 2. Innodb ...
- mysql 开发进阶篇系列 13 锁问题(关于表锁,死锁示例,锁等待设置)
一. 什么时候使用表锁 对于INNODB表,在绝大部分情况下都应该使用行锁.在个别特殊事务中,可以考虑使用表锁(建议). 1. 事务需要更新大部份或全部数据,表又比较大,默认的行锁不仅使这个事务执行效 ...
- mysql 开发进阶篇系列 12 锁问题(隔离级别下锁的差异)
1. innodb在不同隔离级别下的一致性读及锁的差异 不同的隔离级别下,innodb处理sql 时采用的一致性读策略和需要的锁是不同的,同时,数据恢复和复制机制的特点,也对一些sql的一致性读策略和 ...
- mysql 开发进阶篇系列 7 锁问题(innodb锁争用情况及锁模式)
1 .获取innodb行锁争用情况 1.1 通过检查innodb_row_lock状态变量来分析系统上的行锁的争夺情况 SHOW STATUS LIKE 'innodb_row_lock%' 通过in ...
- mysql 开发进阶篇系列 11 锁问题 (恢复和复制的需要,对锁机制的影响)
1. 恢复和复制的需要,对innodb锁机制的影响 mysql 通过binlog文件对增删除改等更新数据的sql语句,实现数据库的恢复和主从复制.mysql的恢复机制(复制其实就是在slave mys ...
- mysql 开发进阶篇系列 9 锁问题 (Innodb 行锁实现方式)
一.概述 Innodb 行锁是通过给索引上的索引项加锁来实现的.这一点与(oracle,sql server)不同后者是通过在数据块中对相应的数据行加锁.这意味着只有通过索引条件检索数据,innodb ...
- mysql 开发进阶篇系列 8 锁问题 (共享锁与排它锁演示)
1 .innodb 共享锁(lock in share mode)演示 会话1 会话2 SET autocommit=0; SELECT cityname FROM city WHERE city_ ...
随机推荐
- # 2019-2020-4 《Java 程序设计》结对项目总结
2019-2020-4 <Java 程序设计>结对项目阶段总结---<四则运算--整数> 一.需求分析 实现一个命令行程序 要求: 自动生成小学四则运算题目(加,减,乘,除): ...
- 使用双引擎,让kbmmw 的客户端访问更方便
前面我们一直都讲了如何使用kbmmw smarthttpservice 给客户端提供REST 服务.主要都是返回给 浏览器访问的,如果我们使用delphi 开发桌面应用,如何使用这些服务呢?其实一切 ...
- inet_pton, inet_ntop
Linux下这2个IP地址转换函数,可以在将IP地址在“点分十进制”和“整数”之间转换而且,inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6.算是比较新的函数了. inet_ ...
- spring学习(二)---依赖注入
spring第二个特性是依赖注入. 学习依赖注入,首先应该明白两个问题:1,谁依赖谁:2,谁注入,注入什么? 首先还是看代码: 还是这个bean: package testSpring.busines ...
- Notes : <Hands-on ML with Sklearn & TF> Chapter 6
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- js获取当前页面的url网址信息小汇总
在WEB开发中,时常会用到javascript来获取当前页面的url网址信息,在这里是我的一些获取url信息的小总结. 下面我们举例一个URL,然后获得它的各个组成部分:http://i.cnblog ...
- _ZNote_Qt_按钮增加图片
给Button添加图片方法 有三种 一 : 用代码添加 QPushButton *findBtn = new QPushButton(this); //创建按钮 QIcon ico (":/ ...
- IDEA教程
IDE-Intellij IDEA 之前同事一直给我推荐IDEA,说跟eclipse相比就是石器时代的工具,我一直任何一个工具熟练起来都很牛逼,所以一直坚持使用eclipse,不过看了下IDEA的功能 ...
- HTML标签的绝对路径和相对路径
我在javaweb中写json的Demo的时候遇到了这个问题,图片一一直取不出来,查了好久终于解决了,所以现在记录一下. 绝对路径: 其实很容易理解,如果你是一个普通的项目,那就是它在你电脑里真实存在 ...
- java maven web 项目启动之后,访问所有页面为空白,不是404!!!
自己解决了大半天,后面通过解决spring单元测试的时候,发现单元测试可以用了,项目启动也可以访问页面了,具体原因不太清楚 可能原因: (1)pom.xml 依赖有重复的地方 (2)不排除与公司内网有 ...