一文详解Mysql锁&事务隔离级别

MySQL事务和锁 作者:IT王小二 博客:https://itwxe.com MySQL是怎么解决并发事务所产生的问题呢?又借助了哪些锁的思想呢?这篇小二给小伙伴们继续唠一唠MySQL的那些事。 一、事务是什么 事务是由一组SQL语句组成的逻辑处理单元,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。通常有下面4个特性,也就是咱程序猿俗称的ACID属性。 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全部执行,要么全部不执行。举个例子:情人节小二给女朋友转账520块,那么SQ. 阅读详情

一、锁的定义

  锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除了传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供需要用户共 享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

二、锁的分类

  从性能上分为乐观锁(用版本号对比来实现)和悲观锁

update ticket set count=count-1,version=version+1 where id=1 and version=2

  从对数据库操作的类型分,分为读锁和写锁(都属于悲观锁):

  • 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
  • 写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁

  从对数据操作的粒度分,分为表锁,行锁和页面锁

  • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
  • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
  • 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

  存储引擎支持情况:

  • 死锁: 多个进程互相等待对方锁的释放
  • 锁冲突:一个进程等待另一个进程释放需要的锁

三、MyISAM的表锁(偏读)

  mysql5.5之前默认支持的存储引擎 MySQL的表级锁有两种模式:

  • 表共享读锁(Table Read Lock)
  • 表独占写锁(Table Write Lock)。

  MySQL中的表锁兼容性:

  对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写请求;MyISAM表的读和写操作之间,以及写和写操作之间是串行的! (当一线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。)

  1、基本操作

  建表SQL:

CREATE TABLE `mylock` (
`id` INT (11) NOT NULL AUTO_INCREMENT,
`NAME` VARCHAR (20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE = MyISAM DEFAULT CHARSET = utf8;

  插入数据:

INSERT INTO `mylock` (`id`, `NAME`) VALUES ('1', 'a');
INSERT INTO `mylock` (`id`, `NAME`) VALUES ('2', 'b');
INSERT INTO `mylock` (`id`, `NAME`) VALUES ('3', 'c');
INSERT INTO `mylock` (`id`, `NAME`) VALUES ('4', 'd');

  手动增加表锁:

lock table 表名称 read(write),表名称2 read(write);

  查看表上加过的锁:

lock table mylock read;
show open tables;
show open tables where in_use >=1;
show open tables where `table`='mylock';
show open tables; --会返回以下字段:
--DataBase:含有该表的数据库
--Table :表名称 
--In_use:表当前被查询使用的次数。如果该数为零,则表是打开的,但是当前没有被使用。
--Name_locked:表名称是否被锁定。名称锁定用于取消表或对表进行重命名等操作。 

  删除表锁:

unlock tables;

关于C/C++Linux后台服务器开发高级架构师学习视频 点击 服务器架构师资料 获取,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK等等。免费学习地址:C/C++Linux服务器开发高级架构师/Linux后台架构师

 2、案例分析

  加读锁:

  • 当前session和其他session都可以读该表
  • 当前session中增删改该表都会报错,其他session增删改则会阻塞等待
  • 当前session中增删改查其他表会报错,其他session可以对其他表增删改查

  加写锁:

  • 当前session对该表的增删改查都没有问题,其他session对该表的所有操作被阻塞
  • 当前session中增删改查其他表会报错,其他session可以对其他表增删改查

  3、结论

  MyISAM在执行查询语句(SELECT)前, 会自动给涉及的所有表加读锁, 在执行增删改操作前,会自动给涉及的表加写锁。

  • 对MyISAM表的读操作(加读锁) ,不会阻寒其他进程对同一表的读请求,但会阻赛对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
  • 对MylSAM表的写操作(加写锁) ,会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。

  简而言之,就是读锁会阻塞写,但是不会阻塞读。而写锁则会把读和写都阻塞。

四、InnoDb的行锁(偏写)

  • InnoDb支持表锁和行锁,开启一个新的事务会释放表锁。
  • InnoDB支持事务(TRANSACTION)。

  思考: 修改表字段,因为表数据量大,导致大量用户阻塞,无法访问,如何解决?

  innodb 在 ddl 的时候所执行的操作:

  1. 按照原始表 (original_table) 的表结构和 ddl 语句,新建一个不可见的临时表 (temporary_table)
  2. 在原表上面加上 WRITE LOCK 阻塞所有的更新操作 (insert、delete、update等操作)
  3. 执行 insert into tmp_table select * from original_table
  4. rename original_table 和 tmp_table,最后 drop original_table
  5. 最后释放掉 write lock

  pt-online-schema-change 可以在不阻塞写入的情况下改动数据表:

  • 首先创建一个和你要执行的 alter 操作的表一样的空的表结构。
  • 执行我们赋予的表结构的修改,然后 copy 原表中的数据到新表里面。
  • 在原表上创建一个触发器在数据 copy 的过程中,将原表的更新数据的操作全部更新到新的表中来。 这 里特别注意一下,如果原表中已经定义了触发器那么工具就不能工作了,因为 pt 使用到了数据库的触发器。
  • copy 完成之后,用 rename table 新表代替原表,默认删除原表。

  1、行锁支持事务

  1.1、事务ACID特性

  事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个特性,通常简称为事务的ACID特性。

  A: 原子性(atomicity):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个 环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从 来没有执行过一样。

  C: 一致性(consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

  I: 隔离性(isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行 时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读已提交(read committed)、可重复读(repeatable read)和串行化 (Serializable)。

  D: 持久性(durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

  1.2、并发事务处理带来的问题

  更新丢失(Lost Update):当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事 务的存在,就会发生丢失更新问题–最后的更新覆盖了由其他事务所做的更新。

  脏读(Dirty Reads):一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致的状 态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并 据此作进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象的叫做“脏读”。一句话:事务A读取到了事务B已经修改但尚未提交的数据,还在这个数据基础上做了操作。此 时,如果B事务回滚,A读取的数据无效,不符合一致性要求。

  不可重读(Non-Repeatable Reads):一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生
了改变、或某些记录已经被删除了!这种现象就叫做“不可重复读”。一句话:事务A读取到了事务B已经提交的修改数据,不符合隔离性

  幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的 新数据,这种现象就称为“幻读”。一句话:事务A读取到了事务B提交的新增数据,不符合隔离性

  • 脏读是事务B里面修改了数据
  • 幻读是事务B里面新增了数据

  1.3、事务隔离级别

  脏读”、“不可重复读”和“幻读”,其实都是数据库读一致性问题, 必须由数据库提供一定的事务隔离机制来解决。

  数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是使事务在一 定程度上“串行化”进行,这显然与“并发”是矛盾的。同时,不同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对“不可重复读"和“幻读”并 不敏感,可能更关心数据并发访问的能力。

-- 常看当前数据库的事务隔离级别
show variables like 'tx_isolation';
-- 查看当前会话隔离级别 select @@tx_isolation;
-- 查看系统当前隔离级别
select @@global.tx_isolation;
-- 设置为读未提交
set tx_isolation='read-uncommitted';
-- 设置为读已提交
set tx_isolation='read-committed';
-- 设置为可重复读
set tx_isolation='REPEATABLE-READ';
-- 设置为串行化
set tx_isolation='SERIALIZABLE';

  2、案例分析

CREATE TABLE `account` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`balance` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `account` (`name`, `balance`) VALUES ('fox', '600');
INSERT INTO `account` (`name`, `balance`) VALUES ('monkey', '1000');

  2.1、读未提交

  (1)打开一个客户端A,并设置当前事务模式为read uncommitted(未提交读),查询表account的 初始值:

set tx_isolation='read-uncommitted';

  (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account:

update account set balance=balance-50 where id=1;

  (3)这时,虽然客户端B的事务还没提交,但是客户端A就可以查询到B已经更新的数据:

  (4)一旦客户端B的事务因为某种原因回滚,所有的操作都将会被撤销,那客户端A查询到的数据其实 就是脏数据:

 (5)在客户端A执行更新语句update account set balance = balance - 50 where id =1, 更新后结果没变,产生了脏读问题。

 关于C/C++Linux后台服务器开发高级架构师学习视频 点击 服务器架构师资料 获取,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK等等。学习地址:C/C++Linux服务器开发高级架构师/Linux后台架构师

2.2、读已提交

  (1)打开一个客户端A,并设置当前事务模式为read committed(未提交读),查询表account的所有记录:

set tx_isolation='read-committed';

  (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account:

  (3)这时,客户端B的事务还没提交,客户端A不能查询到B已经更新的数据,解决了脏读问题:

  (4)客户端B的事务提交
      

  (5)客户端A执行与上一步相同的查询,结果 与上一步不一致,即产生了不可重复读的问题
      

  2.3、可重复读

  (1)打开一个客户端A,并设置当前事务模式为repeatable read,查询表account的所有记录

set tx_isolation='repeatable-read';

  (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account并提交。

   (3)在客户端A查询表account的所有记录,与步骤(1)查询结果一致,没有出现不可重复读的问题

  (4)在客户端A,接着执行update balance = balance - 50 where id = 1,balance没有变成500- 50=450,fox的balance值用的是步骤(2)中的450来算的,所以是400,数据的一致性倒是没有被破 坏。可重复读的隔离级别下使用了MVCC机制,select操作不会更新版本号,是快照读(历史版本); insert、update和delete会更新版本号,是当前读(当前版本)。

  (5)重新打开客户端B,插入一条新数据后提交

INSERT INTO `account` (`name`, `balance`) VALUES ('lion', '1000');

  (6)在客户端A查询表account的所有记录,没有 查出新增数据,所以没有出现幻读
      

  (7)验证幻读

  在客户端A执行update account set balance=balance-50 where id = 3;能更新成功,再次查询能查到客户端B新增的数据。

  幻读前提:更新操作包含了事务B新插入的数据。

  2.4、串行化

  (1)打开一个客户端A,并设置当前事务模式为serializable,查询表account的初始值:

set tx_isolation='serializable';

  (2)打开一个客户端B,并设置当前事务模式为serializable,插入一条记录报错,表被锁了插入失败,mysql中事务隔离级别为serializable时会锁表,因此不会出现幻读的情况,这种隔离级别并发性极低,开发中很少会用到。 读锁-----写操作---写锁

INSERT INTO `account` (`name`, `balance`) VALUES ('panda', '1000');

  思考 :Mysql默认级别是repeatable-read,有办法解决幻读问题吗? 间隙锁在某些情况下可以解决幻读问题

  要避免幻读可以用间隙锁,在Session_1下面执行:

update account set name = 'duck' where id > 10 and id <=20;

  则其他Session没法插入这个范围内的数据(阻塞):

  并且超过一定时间会timeout:

  3、结论

  Innodb存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定会要更高一下,但是在整体并发处理能力方面要远远优于MYISAM的表级锁定的。当系统并发量高的时候,Innodb的整体性能和MYISAM相比就会有比较明显的优势了。

  但是,Innodb的行级锁定同样也有其脆弱的一面,当我们使用不当的时候,可能会让Innodb的整体性能表现不仅不能比MYISAM高,甚至可能会更差。

  4、行锁分析

  通过检查InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况:

show status like 'innodb_row_lock%';

  对各个状态量的说明如下:

Innodb_row_lock_current_waits: 当前正在等待锁定的数量

Innodb_row_lock_time: 从系统启动到现在锁定总时间长度

Innodb_row_lock_time_avg: 每次等待所花平均时间

Innodb_row_lock_time_max: 从系统启动到现在等待最长的一次所花时间

Innodb_row_lock_waits: 系统启动后到现在总共等待的次数

  对于这5个状态变量,比较重要的主要是:

Innodb_row_lock_time_avg (等待平均时长)

Innodb_row_lock_waits (等待总次数)

Innodb_row_lock_time(等待总时长)

  尤其是当等待次数很高,而且每次等待时长也不小的时候,我们就需要分析系统中为什么会有如此多的等待,然后根据分析结果着手制定优化计划。

五、for update行锁

  • 行锁:对当前数据加锁
  • 表锁:对整个数据表加锁

  思考:如果没查到记录会锁表吗? 答案是基于是否有索引,是否执行计划的type是all或者range。如果涉及all或者range会锁整个表。

  for update 行锁存在高并发并且对于数据的准确性很有要求的场景,仅适用于InnoDB,并且必须开启事务,在begin与commit之间才生效。 当有明确指定的主键时候,是行级锁。否则是表级锁:

-- 例1: (明确指定主键,并且有此记录,行级锁)
SELECT * FROM account WHERE id=1 FOR UPDATE;
-- 例2: (明确指定主键/索引,若查无此记录,无锁)
SELECT * FROM account WHERE id=-1 FOR UPDATE;
-- 例3: (无主键/索引,表级锁) all
SELECT * FROM account WHERE name='fox' FOR UPDATE;
-- 例4: (主键/索引不明确,表级锁) range
SELECT * FROM account WHERE id<>'3' FOR UPDATE; 
SELECT * FROM account WHERE id LIKE '3' FOR UPDATE;

  如何知道当前SQL语句会是行锁还是锁表,可以通过查看执行计划type字段(explain sql语句)确认:

  死锁演示:

  set tx_isolation='repeatable-read';
-- Session_1执行:
  select * from account where id=1 for update;
-- Session_2执行:
  select * from account where id=2 for update;
-- Session_1执行:
  select * from account where id=2 for update;
-- Session_2执行:
  select * from account where id=1 for update;
-- 查看近期死锁日志信息:
  show engine innodb status\G;

  大多数情况mysql可以自动检测死锁并回滚产生死锁的那个事务,但是有些情况mysql没法自动检测死锁:

六、优化建议

  • 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁;
  • 合理设计索引,尽量缩小锁的范围;
  • 尽可能减少检索条件,避免间隙锁;
  • 尽量控制事务大小,减少锁定资源量和时间长度;
  • 尽可能低级别事务隔离。
MySQL 事务与锁详解 事务是数据库操作的基本单元,由一组 SQL 语句组成,要么全部成功,要么全部失败。锁用于控制并发访问,保证数据一致性。 阅读详情

相关推荐

AC7811无感FOC实战:从开环到闭环的电机控制调试全记录

本文详细记录了基于国产AC7811芯片实现无感FOC电机控制的全过程。从硬件软件环境搭建、开环I/F启动调试,到滑模观测器参数整定,再到平滑切入闭环及双环PID调节,提供了完整的实战步骤与参数调试心法。文章重点分享了无感控制从开环到闭环切换的关键技巧与常见问题排查清单,为工程师提供了一份避坑指南。

kotlin6android的博客 713

mysql锁表的解决方法_记一次Mysql 数据库诡异锁表解决过程

Mysql锁表现象1、目前线下业务中心N个,每一个线下业务中心,拥有独立的内网服务器,用于线下业务,部分中心务偶尔性的出现业保存时卡住无法进行的情况一旦卡住则无法使用,时间不确定、周期不确定,部分中心周期短的时候1周一次,时间长的可能一两个月一次,而实际业务量基本保持稳定增长,没有大变化 。2、同样的代码仅在部分中心出现该问题。3、表引擎为innodb4、 mysql版本为5.6.x5、 服务器基...

weixin_42653691的博客 935

AArch64 ARM64 寄存器介绍

除了上述通用寄存器,还有FPSR(浮点状态寄存器)和 FPCR(浮点控制寄存器)等。X29寄存器和X30寄存器在函数调用和堆栈帧的管理中扮演着关键角色。AArch64架构提供了31个通用寄存器,每个寄存器都可以用作64位X寄存器(X0~X30)或32位W寄存器(W0~W30)。使用X寄存器将导致64位的计算,使用W寄存器将导致32位的计算。EL0、EL1、EL2和EL3是AArch64架构中定义的四个特权级别(Exception Levels),用于支持不同的执行环境和特权级别。

lml435035844的博客 1万+

SHOW OPEN TABLES语法

SHOW OPEN TABLES [FROM db_name] [LIKE ‘pattern’] SHOW OPEN TABLES列举在表缓存中当前被打开的非TEMPORARY表。 SHOW OPEN TABLES会返回以下字段: Database 含有该表的数据库。 Table 表名称。 In_use 表当前被查询使用的次数。如果该数为零,则表是打开的,但是当前没有被使用。 Nam...

liu_sisi的博客 1万+

【BAAS】基于supabase的知识库详细设计

为满足快速开发需要和减少开发及维护成本,使用BAAS(Backend-as-a-Service)模式可以很好的降低我们的后端维护成本,并提高前端对接效率。一般来说,BAAS是一种云服务模式,BaaS供应商会为提供一些通用的能力,例如用户身份验证、数据库管理、远程更新和推送通知(针对移动应用程序),以及云存储和自托管。BaaS最主流的是Google的firebase,具有相当完善的功能和集成方案,但他是收费的,而且在我们实际项目中,可能需要私有化部署,这时就需要一些开源的替代方案,例如主流的。

Ric的博客 1781

Docker部署OnlyOffice踩坑实录:解决editor.bin下载失败的3种姿势

本文详细解析了Docker部署OnlyOffice时editor.bin下载失败的常见原因,并提供了三种核心解决方案。重点剖析了容器网络配置、Nginx反向代理(特别是proxy_pass设置)以及安全策略调整,帮助开发者彻底解决静态资源加载问题,确保文档协作平台稳定运行。

weixin_29281941的博客 873

记一次Mysql 数据库诡异锁表解决过程

Mysql锁表现象 1、目前线下业务中心N个,每一个线下业务中心,拥有独立的内网服务器,用于线下业务,部分中心务偶尔性的出现业保存时卡住无法进行的情况一旦卡住则无法使用,时间不确定、周期不确定,部分中心周期短的时候1周一次,时间长的可能一两个月一次,而实际业务量基本保持稳定增长,没有大变化 。 2、同样的代码仅在部分中心出现该问题。 3、表引擎为innodb 4、 mysql版本为5.6....

久酷的优快云专栏 607

QCC304x系列开发教程(基础篇)之2.1-QCC3040之开发环境搭建

一、安装MDE 1.解压qualcomm_mde.win.2.4_installer_2.4.1.4压缩包,安装MDE_WIN_2.4.1.4_x64.exe,路径自定义 点击NEXT, 安装完成后,点击Finish. 完成安装后,桌面生成快捷方式

心跳包的博客 6080

MySQL并发控制:锁机制

当数据库中有多个操作需要修改同一数据时,不可避免的会产生数据的脏读。这时就需要数据库具有良好的并发控制能力,这一切在MySQL中都是由服务器和存储引擎来实现的。 当一个select语句在执行时可以施加读锁,这样就可以允许其它的select操作进行,因为在这个过程中数据信息是不会被改变的这样就能够提高数据库的运行效率。当需要对数据更新时,就需要施加写锁了,不在允许其...

黄规速博客:学如逆水行舟,不进则退 1万+

2024年CSP-X复赛真题题解(T1:购物)

2024年CSP-X复赛真题题解(T1:购物)

王老师青少年编程 1182

【ComfyUI报错解决】K采样器 mat1和mat2形状不匹配错误分析与修复 mat1 and mat2 shapes cannot be multiplied (77x2048 and 4096x

如果你在 ComfyUI 里遇到K采样器报错:mat1 和 mat2 shapes cannot be multiplied确认大模型和 LoRA 是否是同一版本(SDXL vs SD1.5,不能混用)。如果用了双 CLIP 加载器,要确认加载的类型和选择的模型类型是否匹配。加载→ 类型选flux加载 SDXL 专用的 clip/t5 → 类型选sdxl避免不同版本模型和 LoRA 混搭,保持一致性。模型+LoRA+CLIP 类型必须保持同一版本,不然就会报错。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2411

Myisam中的锁实战—如何验证读写锁

一、Myisam中的锁 Myisam中有读锁与写锁。只有表锁,无行锁。 那么也就是其中只有表级的行锁与表级的写锁。 我们可以通过命令来模拟上锁与解锁的过程。 二、上锁 读锁: lock table a read; 写锁: lock table a write; 三、解锁 unlock tables; 四、查询锁 show open tables; show open tables where...

440

触摸芯片RM1015B基本使用方法

RM1015B触摸芯片使用指南:该芯片采用4通道设计(实际使用3通道),通过I2C接口通信(设备地址0x2B)。硬件设计需注意中断/复位引脚复用,需上拉处理。软件配置包括初始化、中断处理和定时器扫描,通过设置各通道阈值(0-300W)调节灵敏度,值越小越灵敏。调试时可调用rm1015B_debug_func()输出波形数据。典型应用场景包括接近检测和手势识别,中断触发后需在8ms内响应。特别注意不同通道的寄存器映射关系及校准流程,确保检测准确性。

云淡风轻 180

一文看懂 MySQL事务隔离级别与锁

数据库锁 共享锁(Shared lock) 例1: ---------------------------------------- T1: select * from table (请想象它需要执行1个小时之久,后面的sql语句请都这么想象) T2: update table set column1='hello'   过程:T1运行 (加共享锁) T2运行等待T1运行完之后再运...

caohao0591的专栏 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

mysql-事务隔离级别以及锁详解

一、事务的隔离级别 什么是事务、事务有哪些特性 事务的隔离级别有哪些?默认的隔离级别是什么? 在设置可重复读的情况下,如何保证修改的是最新的数据? mysql中设置事务隔离级别以及事务的操作 二、锁 说说mysql中有那些锁? innodb有哪些行锁算法 innodb如何选择行锁与表锁 什么是死锁?怎么解决死锁问题? 事务与锁状态信息查看

Promise_J_Z 3603

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

MySQL的事务以及锁详解

老铁有一提问“MySQL的可重复读级别能解决幻读吗”,一听就有猫腻,实话说,之前从未思考到这个问题,很是懵逼,于是深入查看,发现了自己的细节欠缺是在太多,补上! 事务基础知识: 数据库原理理论 事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。在关系数据库中,一个事务可以是一组SQL语句或整个程序。

qq_22162093的博客 2723

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

MySQL 事务隔离级别与锁机制详解

MySQL 事务隔离级别与锁机制详解

kerwin的博客 7427

MySql 事务 & 锁

一组逻辑操作单元,使数据从一种状态变换到另一种状态。保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。

cimbala的博客 830

一文读懂mysql事务隔离级别和锁的关系

预备知识 ​ mysql5.5以上版本中默认使用的存储引擎是基于InnoDB,所以本文所有关机都是基于InnoDB存储引擎。 锁 行锁:顾名思义,该锁锁住的是表中数据的某一行数据,共享锁和互斥锁都属于行锁。另外行锁可以使用的前提条件是SQL语句必须使用到了索引(如果不知道何为索引,可以先了解一下,当然不了解也不影响理解后面的知识),否则不会使用行锁,而是使用表锁。 共享锁(S):共享锁也称为读锁,共享锁和共享锁之间是兼容的,但和排他锁不兼容。什么意思呢?假设事务A加了一个共享锁,那么事务B是可以申请共享

qq_41885278的博客 1118

Mysql事务隔离级别与锁

数据库的事务有几种特性,例如一致性和隔离性,一般通过加锁来实现。同时数据库又是一个高并发的应用,如果加锁过度或者不当将严重影响性能。数据库提供了几种隔离级别来供选择,本文通过解析InnoDB的加锁机制是如何实现几种隔离级别,来更深刻的理解mysql的锁。    两阶段锁     首先,事务的所操作分为两个阶段:加锁和解锁,两者不想交。因为事务开始时,并不知道会用到哪些数据,所以加锁阶段

end's coding life 6300

Mysql 事务隔离级别和锁的关系

我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在。这里通过分析 MySQL中 InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。 一、一次封锁or两段锁? 因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用到哪些

程序猿进阶 1794

数据库锁 与 事务隔离级别

数据库中有读锁和写锁 默认的select语句有锁吗?这个得看数据库引擎的事务的隔离级别。 事务的隔离级别与锁的关系: 没有隔离级别(不加事务???不对,应该是开启了事务,但是没有隔离级别),这个时候会发生脏写问题: 两个线程操作同一条数据,对其进行更新操作,更新会被覆盖。怎么解决这个问题呢? 应该要通过加写锁(X锁)去解决问题,而且应该是在 Read UnCommit这个隔离级别去解决的 Read UnCommit级别:这个级别应该是解决了脏写的问题(通过加写锁解决的? ??这个结论有待确认).

wdquan19851029的专栏 2233

【MySQL】事务?隔离级别?锁?详解MySQL并发控制机制

在数据库中也不例外,也是通过锁来实现并发控制的。a. 如果InnoDB检测到事务A试图更新的数据已经被事务B更新过(即版本冲突),事务A的更新操作可能会导致一个死锁错误(Deadlock),在这种情况下,InnoDB会选择回滚其中一个事务以解决死锁问题,通常会回滚较晚开始或者较晚修改数据的事务(在这里可能是事务A)。当使用mysql的innodb模式的时候,在mvcc的机制下,当事务A读取了表a的快照,在事务A提交前事务B又去读取了表a并且修改了数据,接下来事务A提交时会有什么效果,直接失败回滚事务还是?

egekm_sefg的博客 760

MySql中的事务、MySql事务详解、MySql隔离级别

思考:我去银行给朋友汇款,我卡上有100元,朋友卡上50元,我给朋友转账50元,如果我的钱刚扣,而朋友的钱又没加时,网线断了, 怎么办(Transaction)是数据库管理系统(DBMS)中的一个核心概念,它确保了一系列数据库操作要么全部成功,要么全部失败,从而维护数据库的完整性和一致性。MySQL在5.5版本开始,就将InnoDB引擎作为默认存储引擎。由于Mysql中的事务是存储引擎实现,而且只有InnoDB支持事务。

m0_74825526的博客 1114

MySQL事务和锁之事务隔离级别

MySQL的事务隔离级别

丿涛哥哥的博客 693

一文详解Mysql事务隔离级别

较低的隔离级别(如READ UNCOMMITTED和READ COMMITTED)可能会提高并发性能,但增加了数据不一致的风险。无论实在实际使用中,还是面试中,都经常会联系到Mysql的事务隔离级别。在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。简单来说,它会在读取的每行数据上都加锁,所以肯呢个导致大量的超时和锁争用问题。允许一个事务读取另一个并发事务已经提交的数据。,即使在这个事务执行期间,其他事务已经提交了修改这些数据的操作。

weixin_40709965的博客 1019
上一篇: 聊聊对不同I/O模型的理解 (阻塞/非阻塞IO,同步/异步IO)
下一篇: Linux内核源码分析方法—程序员进阶必备
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值