返回顶部
首页 > 资讯 > 数据库 >MySQL事务与锁实例教程详解
  • 293
分享到

MySQL事务与锁实例教程详解

2024-04-02 19:04:59 293人浏览 独家记忆
摘要

目录Mysql事务和锁事务事务的控制语句事务隔离级别设置脏读不可重复读幻读锁机制InnoDB的行级锁锁实战死锁总结mysql事务和锁 事务 说到关系型的数据库的事务,相信大家对四大特性都不陌生,分别是原子性、一致性、隔离

mysql事务和锁

事务

说到关系型的数据库的事务,相信大家对四大特性都不陌生,分别是原子性、一致性、隔离性、持久性,简称为ACID特性。

Mysql中支持3种不同的存储引擎:

MyISAM存储引擎、Memory存储引擎、和InnoDB存储引擎

注:只有InnoDB才支持事务。

事务的控制语句

控制语句作用
begin或者start transaction开启一个事务
commit 或者 commit work提交事务,进行持久性修改
rollback 或者 rollback work回滚事务,撤销已经进行修改但未提交的操作
savepoint [保存点]在事务中创建一个保存点,一个事务可以有多个保存点
releasavepoint [保存点]回滚到指定的保存点
set transaction设置事务的隔离级别

事务隔离级别设置

先复习一个事务的四大隔离级别

  • 读未提交(READ-UNCOMMITTED)
  • 读已提交(READ-COMMITTED)
  • 可重复读(RE-PEATABLE-READ)
  • 可序列化读(SERIALIZABLE)

下面是操作过程。

首先,查看默认的事务隔离级别,可以看到是可重复读(REPEATABLE-READ),

show variables like '%isolation%';

脏读

我们来演示一下脏读的场景,下面这张图是展示了我原先已经创建好的两个用户的账号都为100元。

MySQL事务与锁实例教程详解

分别打开两个连接mysql的会话窗口,其中一个会话的隔离级别为READ-UNCOMMITED,然后再另一个窗口中开启一个事务,例如,lisi给zhangsan转账100元,

set session transaction isolation level read uncommitted;
begin;
update user set money=money-100 where user=lisi;

我们在另外一个读未提交的窗口中查看,zhangsan看到钱已经转过来了,但是实际上lisi的事务还没有提交,假如这个时候,lisi不想转账了,回滚事务,那zhangsan就读到脏数据了。

MySQL事务与锁实例教程详解

不可重复读

下面来展示一下不可重复读的场景。

首先我们将zhangsan的窗口的事务隔离级别设置成READ-COMMITTED,并且在两个窗口都开启事务

set session transaction isolation level read committed;

假设zhangsan现在想统计全部人的钱有多少,很明显200;

MySQL事务与锁实例教程详解

但是这个时候lisi往账户里面存了100元,并提交事务,但是这个时候,zhangsan再次查询总和,我们会查询到总金额为300,但是这次查询是处于同一个事务中,查询到两次不一样的结果,属于不可重复读的情况。

update user set money=money+100 where user='lisi';
commit;

MySQL事务与锁实例教程详解

幻读

为了解决不可重复读的问题,我们将事务的隔离等级设置成RE-PEATABLE-READ,即MySQL默认的事务隔离等级,然后在两边都开启一个事务。

set session transaction isolation level repeatable read;

 我们先在一个窗口插入一条数据并提交,然后在另外一个窗口查看,此时是查询不到这个记录的,但是假如这个时候我们新插入一条主键和刚插入的记录一样的话,我们就可以发现

insert into user values('zly1',100);
# 另外一个窗口
insert into user values('zly1',100);
ERROR 1062 (23000): Duplicate entry 'zly1' for key 'user.PRIMARY'

这样也算是一种幻读的现象,但是网上也有一种说法在可重复读的等级下,幻读是可避免的,这种说法不是非常准确的,如果在进行更新和插入时就可能会出现幻读的情况,如果想要解决幻读的情况,可以将事务隔离等级设置到SERIALIZABLE

锁机制

InnoDB的行级锁

InnoDB默认采用的行级锁,分为以下这两种,分别为共享锁和排他锁。

这两个概念我在这篇文章中也有介绍。

共享锁(S锁):也叫读锁,如果在该数据对象上加了共享锁,该事务可以读取但是不能修改数据。其他事务也可以在该对象上加共享锁,但是不能修改数据。

排他锁(X锁):也叫写锁,在一个数据对象只有一把排他锁,获取到该锁的事务可以读取数据和修改数据。

(加锁:一般的查询语句不会加任何的锁类型,当然也可以为数据加锁,比如在select * from … for update,这样可以为数据添加排他锁,而使用select … lock in share mode 可以为数据添加共享锁。

锁实战

首先关闭事务自动提交

set autocommit=0;

我们先在一个窗口输入一条获取到排他锁,虽然操作的是一条数据,但是锁的是整张表,因为我们没有添加索引

select * from user where user='zly1' for update;

MySQL事务与锁实例教程详解

MySQL事务与锁实例教程详解

这个时候我们对user这一列添加索引,就可以看到我们对其进行加锁就不会出现阻塞的情况了。

alter table user add index(user);

MySQL事务与锁实例教程详解

MySQL事务与锁实例教程详解

注:在MySQL的行级锁是针对索引加的锁,而不是针对表中的行加级锁,虽然访问不同行的记录,但是如果不存在对应的索引,或者使用相同的索引的话,就会造成锁的冲突而锁住整张表。

死锁

死锁是指两个或者两个以上的额事务在执行过程中,因为互相的等待或者因为争抢相同的资源而造成的互相等待现象。

我们还是采用刚刚的例子,还是将事务的自动提交关闭掉,首先先在会话1中,更新id为1的记录,然后在会话2中更新id为2的记录,这个时候我们再回来在会话1更新id为2的记录,在会话2中更新id为1的记录,就会产生一个死锁;

MySQL事务与锁实例教程详解

MySQL事务与锁实例教程详解

总结

本文主要介绍了事务的隔离等级和事务的锁机制,主要更加偏向于实战部分,我前面也有一些文章涉及到。

到此这篇关于MySQL事务与锁实例教程详解的文章就介绍到这了,更多相关MySQL事务与锁内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL事务与锁实例教程详解

本文链接: https://lsjlt.com/news/117041.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL事务与锁实例教程详解
    目录mysql事务和锁事务事务的控制语句事务隔离级别设置脏读不可重复读幻读锁机制InnoDB的行级锁锁实战死锁总结MySQL事务和锁 事务 说到关系型的数据库的事务,相信大家对四大特性都不陌生,分别是原子性、一致性、隔离...
    99+
    2024-04-02
  • MySQL InnoDB事务与锁的详细讲解
    这篇文章主要介绍“MySQL InnoDB事务与锁的详细讲解”,在日常操作中,相信很多人在MySQL InnoDB事务与锁的详细讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • 【Mysql】mysql事务处理用法与实例详解
    来源:转载  代码如下 复制代码 root@host# mysql -u root -p pas...
    99+
    2024-04-02
  • Java与Oracle实现事务(JDBC事务)实例详解
    Java与Oracle实现事务(JDBC事务)实例详解J2EE支持JDBC事务、JTA事务和容器事务事务,这里说一下怎样实现JDBC事务。       JDBC事务是由Connec...
    99+
    2023-05-31
    java jdbc事务 ava
  • MySQL事务与锁 - Mr
    一、事务与事务特性 在关系型数据库内,事务是由一个SQL或一组SQL语句组成的逻辑处理单元。也就是说事务就相当于一个盛放SQL的容器,事务中的SQL要么全部执行成功,要么所有已经修改的操作都回滚到原来的操作,即一条SQL也不能执行成功。 ...
    99+
    2016-11-14
    MySQL事务与锁 - Mr
  • mysql实现事务的提交与回滚的实例详解
    最近要对数据库的数据进行一个定时迁移,为了防止在执行过程sql语句因为某些原因报错而导致数据转移混乱,因此要对我们的脚本加以事务进行控制。 首先我们建一张tran_test表 CREATE TABLE ...
    99+
    2024-04-02
  • MySQL的中事务与锁的实现
    本篇内容主要讲解“MySQL的中事务与锁的实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL的中事务与锁的实现”吧!MySQL 中事务的实现在关系型数...
    99+
    2024-04-02
  • Redis教程(八):事务详解
    一、概述: 和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制。在Redis中,MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石。相信对有关系...
    99+
    2022-06-04
    详解 事务 教程
  • MySQL基础篇(06):事务管理,锁机制案例详解
    本文源码:GitHub·点这里 || GitEE·点这里 一、锁概念简介 1、基础描述 锁机制核心功能是用来协调多个会话中多线程并发访问相同资源时,资源的占用问题。锁机制是一个非常大的模块,贯彻MySQL的几大核心难点模块:索引,...
    99+
    2018-06-26
    MySQL基础篇(06):事务管理,锁机制案例详解
  • MySQL数据库事务transaction示例讲解教程
    目录1、什么是事务?2、和事务相关的语句只有这3个DML语句:insert、delete、update3、假设所有的业务都能使用1条DML语句搞定,还需要事务机制吗?4、事务的原理5...
    99+
    2024-04-02
  • Mysql事务以及加锁机制详解
    这篇文章主要讲解了“Mysql事务以及加锁机制详解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mysql事务以及加锁机制详解”吧!事务的特征ACID,即原...
    99+
    2024-04-02
  • MySQL锁机制详解-表锁与行锁
    文章目录 1. 数据库锁理论2. 锁的分类2.1 按数据操作的类型分类2.2 按数据操作的颗粒度分类 3. 表锁的应用3.1 表锁相关命令3.2 给表加表共享读锁3.3 给表加表独占写锁...
    99+
    2023-09-11
    mysql 数据库
  • MySQL索引与事务详解
    MySQL索引与事务详解 一、前言 ​ 上一章我们讲解了MySQL的手工编译安装流程以及相关的数据库操作命令(sql语句),本文将要详细介绍MySQL索引与事务的概念及原理,并初步了解MySQL数据库视...
    99+
    2024-04-02
  • Mysql InnoDB的锁定机制实例详解
    1.InnoDB的锁定机制 InnoDB存储引擎支持行级锁,支持事务处理,事务是有一组SQL语句组成的逻辑处理单元,他的ACID特性如下: 原子性(Atomicity): 事务具有原子不可分割的特性,要么一起...
    99+
    2022-05-18
    mysql innodb锁定 mysqlinnodb mysql排他锁
  • MySQL数据库表被锁、解锁以及删除事务详解
    目录背景故障追踪解决方案第一步:查看表使用第二步:查看进程第三步:查看当前运行的所有事务第四步:查看当前出现的锁第五步:查询锁等待的对应关系第六步:kill掉事务MySQL的锁MyS...
    99+
    2024-04-02
  • Mysql教程分组排名实现示例详解
    目录1.数据源2.数据整体排名1)普通排名2)并列排名3)并列排名3.数据分组后组内排名1)分组普通排名2)分组后并列排名3)分组后并列排名4.分组后取各组的前两名1.数据源 2....
    99+
    2024-04-02
  • MySQL锁与事务隔离级别
    1、概述 (1)锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除了传统的计算资源(如CPU、RAM、IO等)的争用以外,数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据...
    99+
    2021-12-05
    MySQL锁与事务隔离级别
  • MySQL中什么是事务与锁
    这篇文章给大家介绍MySQL中什么是事务与锁,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。  MySQL 中事务的实现  在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的...
    99+
    2024-04-02
  • MySQL死锁的案例详解
    本篇内容介绍了“MySQL死锁的案例详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • MySQL教程子查询示例详解
    目录1、什么是子查询?2、子查询可以出现的位置有哪些?3、where子查询4、from后面使用子查询。(太重要了)1、什么是子查询? 当一个查询是另外一个查询的一部分时,我...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作