mysql事务与锁的机制
我们先来谈谈mysql的锁
锁:顾名思义就是对某个资源(可以是一张表,也有可能是一行或者多行记录)进行加锁操作,让自己有优先处理的权利。唉姑且就这么理解吧!
那么mysql究竟有哪几种类锁呢?
- 共享锁
某些地方叫乐观锁,其实也是它了(东叫一下西叫一下ztm晕,能不能有个统一的叫法!!)那共享锁是怎么个意思呢?还是先举个例子说吧,假如说事务A读到一条记录,并且修改了该条记录的一个字段的值a改成了b,正在这个时候事务B也读到了这条记录并且获取的A事务修改后的字段值b(不会不知道mysqlupdate时候会对记录加锁吧),事务B想把该字段的值改为c,在此时事务A的修改操作并未提交。那对不起了事务B,因为是事务A先对该记录加锁的,你此时还没有对该条记录上锁的权限哦,不要急哦,等事务A提交之后你就可以改了。
好了,差不多明白共享锁了吧,有点啰嗦了,还是简单的在说下吧。
共享锁就是只针对update时候加锁,在未对update操作提交之前,其他事务只能够获取最新的记录但不能够update操作。
2.排他锁
某些地方也把他叫做悲观锁,那么我来给你说下这种锁是怎么个悲剧法的哈,稍等。。。
还是一样,先来个例子展示下它的悲剧
还是用上个例子吧,事务A查到一个记录,并修改了其中的一个字段a的值为b,这个时候事务B来获取这条记录,我靠,怎么获取不到呢?原来是排他锁在作怪,这是什么情况。原来排他锁在获取记录的时候就对这条记录上了锁,而且别的事务连获取这条记录的权限都没有,更别提要修改了,必须等到事务A提交了事务释放了锁之后别的事务才能够获取到这条记录。排他锁,你也太tm小心眼了吧!!
所以,知道什么是排他锁了吧,
一句话,就是在一开始就对记录上锁了,在本事务未提交之前别的事务无权进行任何操作。我晕,我觉得该把它叫小气锁更好更贴切。
那么既然有这两种锁,你认为那种锁比较好,你会选用哪种锁呢?
呵呵,不要听我的误导哦,其实这两种锁各有利弊,不要看叫乐观锁就很乐观,叫悲观锁就很悲观哦,这个要看你项目的具体业务的。。
假如你的项目对并发很高对效率要求很高,那么你该选用乐观锁,因为在别的事务对某些记录上锁后在事务未提交之前其他事务是有权限去查看的,但是当出现意外导致事务回滚时候,其他事务会多进行一步操作,那就是重新获取这些对象了,不过这比排队等锁要好多了
假如你的项目并发数不是很多,同时对整个业务的原子操作要求很高这个时候排他锁是很不错的选择。
好了,前面我们废话了这么多,那么mysql究竟能对那些对象上锁呢?带着这个问题下一步我们就得了解下mysql的锁的级别了。
mysql锁的级别分为三类:页级锁,表级锁,行级锁。
那有三个级别的锁,mysql究竟用的是哪个级别的呢?这个还得看你用的是什么mysql的引擎了
mysql大概有下面几个数据库引擎和对应的锁级别
MyISAM引擎:使用的是表级锁
MEMORY/heap:使用的是表级锁
BDB:使用的是页级锁,不过它也支持表级锁的哦
InnoDB:使用的是行级锁,它夜支持表级锁的哦
好了,关于锁的东西我大概的是说完了,下面在聊聊mysql的事务吧
事务是什么东西,那么我们还是来简单说下吧
事务,以我的理解来说就是对数据库的一次原子性的操作。
这个原子操作包含多个数据操作语句,要是单条select语句就没有加事务的必要性了。
那么在多个事务对共享数据进行操作时就容易发生数据不一致啊等等的问题了,那么sql标准定义了如下几个名词
1、脏读(dirty reads)
定义:一个事务读取了另一个并行事务未提交但更改过的数据。
2、不可重复读(non-repeatable reads)
一个事物重新读取前面读过的数据出现不一致,两次读取中间该数据已被其他事务修改过。
3、泛读(phantom read)
一个事务重新去执行一次查询发现有新的一条或者一批新的记录,或者少了一条或者一批记录导致两次读取数据的总数出现不一致。
从上面可以看出,会出现如上这些问题肯定不会使用的是悲观锁咯,悲观锁在读取记录的时候就对对象加锁。不过一般项目中使用悲观锁的的确不怎么推荐。那既然这样的话,如果使用加锁来避免这些情况那么只能使用悲观锁喽,我们都知道悲观锁对性能和效率会大打折扣的,在一些高并发网站中肯定是不会使用这类锁的,所以这就出现了并发事务隔离级别来解决这类问题,下面来了解下sql事务的隔离级别。
sql事务的隔离级别有如下几类
1、读未提交
一个事务读到另一个没有提交的事务中的数据。
2、读已提交
3、可重复读(mysql的默认隔离级别)
4、可串行化
各隔离级别的数据一致性匹配表
事务隔离级别 |
脏读 |
不可重复读 |
泛读 |
读未提交 |
可能 |
可能 |
可能 |
读已提交 |
不可能 |
可能 |
可能 |
可重复读 |
不可能 |
不可能 |
可能 |
可串行化 |
不可能 |
不可能 |
不可能 |
分享到:
相关推荐
### MySQL事务与锁机制详解 #### 一、锁概念简介 **1、基础描述** 锁机制主要用于解决数据库中多线程或多个会话同时访问同一数据资源时出现的竞争问题。在MySQL中,锁机制是非常重要的组成部分之一,它与其他核心...
在本文中,我们将重点讨论几个与事务相关的知识点,包括事务在MySQL中的表现形式、事务的隔离级别、以及事务在操作中如何与锁机制交互。 首先,我们通过一个转账的例子来说明事务的四个特性是如何在实际操作中体现...
MySQL 8.0 锁机制和事务 MySQL 8.0 中的锁机制和事务是数据库系统中非常重要的概念。锁机制是指数据库系统中对数据访问的控制机制,而事务是指数据库系统中的一组操作单元。了解锁机制和事务是非常关键的,因为它们...
深入理解Mysql事务隔离级别与锁机制 Mysql事务隔离级别与锁机制是数据库系统中非常重要的概念,它们都是为了解决多事务并发问题而设计的。下面我们将深入讲解这些机制,让大家彻底理解数据库内部的执行原理。 事务...
1.事务 1.1 什么是事务? 事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。 1.2 哪些引擎支持事务 InnoDB支持事务 1.3 事务的四大特性 原子性(Atomicity):强调事务的不可分割,...
MySQL事务与锁详解的知识点如下: 1. 事务的理解与应用场景: 事务是数据库管理系统(DBMS)执行过程中的逻辑单位,是一个不可分割的工作单元,可以包含一条或多条DML语句。在实际应用中,事务常见的使用场景包括:当...
MySQL的锁机制是数据库管理系统中用于控制并发操作的重要机制,对于多用户环境下的数据一致性、事务隔离性和系统性能有着至关重要的影响。本文将深入探讨MySQL的高级锁机制,包括表锁和行锁,并提供一些优化建议。 ...
在MySQL中,锁机制是保障数据操作安全的重要组成部分,其主要分为表锁、行锁和间隙锁。本知识点详细解读了MySQL锁机制的定义、分类、特点以及具体的应用案例。 1. 锁的定义和分类 在数据库系统中,锁是用来控制多...
### MySQL数据库:事务与锁机制 #### 一、事务的基础概念与特性 ##### 1. 事务的概念 事务(Transaction)是数据库操作的基本单位。它确保了一组操作要么全部成功,要么全部失败,从而保持数据的一致性和完整性。...
详解Mysql事务隔离级别与锁机制 本篇文章详细介绍了Mysql事务隔离级别与锁机制的概念、原理和应用。事务隔离级别是数据库系统中的一种机制,用于解决多事务并发问题,包括脏写、不可重复读、幻读等问题。锁机制是...
"深入理解Mysql事务隔离级别与锁机制" 事务隔离级别是数据库系统中的一种机制,用于解决多事务并发问题,使得事务之间的执行不受影响。这种机制可以分为四个级别:Read Uncommitted、Read Committed、Repeatable ...
本知识点将深入探讨MySQL中的事务隔离级别和锁机制,这是确保数据一致性和并发控制的关键概念。 首先,让我们了解什么是事务。在数据库中,事务是一系列操作的集合,这些操作被视为一个逻辑工作单元,要么全部执行...
### MySQL_InnoDB 事务与锁详解 ...总结而言,事务和锁机制对于确保数据库的一致性和并发处理至关重要。通过合理设置事务隔离级别和使用适当的锁类型,可以有效地控制事务间的影响,确保数据的准确性和安全性。
MySQL的Insert锁机制是数据库管理系统中确保数据一致性和并发控制的重要组成部分。在MySQL的InnoDB存储引擎中,插入操作不仅涉及到行级锁,还可能涉及Gap锁和Next-Key Locks,这些锁机制的设计是为了防止幻读...
MySQL的锁机制是数据库管理系统中用于控制并发操作的重要机制,对于保证数据的一致性和完整性起着至关重要的作用。本文将深入解析MySQL中的锁机制,帮助读者理解其工作原理,为面试准备或日常数据库管理提供有力支持...
MySQL中的锁机制是数据库管理系统用于控制并发事务对数据资源访问的关键技术之一。合理地管理和利用锁机制能够有效地防止数据不一致性和提高系统的并发处理能力。MySQL支持多种锁类型,包括表级锁、行级锁和页面锁等...
MySQL锁机制是数据库管理系统中用于协调多个事务或者进程,以保证数据的完整性和一致性的一套规则。在数据库操作中,保证数据并发访问时的一致性、有效性是至关重要的,锁机制正是为此而生。 MySQL支持不同存储引擎...
4-7深入理解Mysql事务隔离级别与锁机制.mp4
4-6深入理解Mysql事务隔离级别与锁机制.mp4