事务的四个特性、四个隔离级别以及数据库的常用锁

这篇具有很好参考价值的文章主要介绍了事务的四个特性、四个隔离级别以及数据库的常用锁。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

事务的四个特性、四个隔离级别以及数据库的常用锁
四大特性
事务的四大特性,通常被称为ACID特性,是数据库管理系统(DBMS)确保事务处理的关键属性。这四大特性分别是:

原子性(Atomicity): 原子性要求事务是一个不可分割的单位,要么全部执行,要么全部不执行。如果事务中的任何一部分操作失败,整个事务都必须回滚到最初状态,没有部分完成的情况。
一致性(Consistency): 一致性确保事务使数据库从一个一致性状态转变为另一个一致性状态。在事务执行前和执行后,数据库必须保持一致性。例如,在银行转账中,无论操作成功与否,账户总额必须保持一致。
隔离性(Isolation): 隔离性指多个事务可以并发执行,但其执行的效果不能相互影响。每个事务应该感觉好像它是系统中唯一运行的事务一样,而不受其他并发事务的影响。这有助于防止并发事务之间的数据不一致性问题。
持久性(Durability): 持久性确保一旦事务提交,其结果将永久保存在数据库中,即使系统崩溃或重新启动,提交的更改也不会丢失。
并发问题
数据库并发访问可能导致多种问题,主要与多个事务同时操作数据库时的交互有关。并发访问所产生的问题,在有些场景下可能是允许的,但是有些场景下可能是致命的。

脏读(Dirty Read): 一个事务读取了另一个事务尚未提交的数据。如果事务A读取了事务B的未提交数据,而事务B后来回滚了,那么事务A读取的数据就是脏数据。
不可重复读(Non-repeatable Read): 一个事务在两次读取同一数据之间,该数据被其他事务修改,导致两次读取的结果不同。这可能导致事务在处理相同数据时得到不一致的结果。
幻读(Phantom Read): 一个事务按相同的查询条件重新读取已检索的数据,但在两次读取之间,其他事务插入了新的数据,导致第二次读取的结果不同。这与不可重复读不同,因为幻读涉及到一批数据整体的变化。
丢失修改(Lost Update): 两个事务同时读取相同的数据,然后都进行修改,并尝试提交。由于事务是并发执行的,可能存在其中一个事务的修改被覆盖,导致数据的丢失。
死锁(Deadlock): 多个事务相互等待对方释放锁资源,导致它们无法继续执行。这是一种阻塞现象,需要通过某种机制来检测和解除死锁。
这些问题在多用户、多事务并发访问数据库时可能出现,为了处理这些问题,数据库系统提供了不同的隔离级别,例如读未提交、读已提交、可重复读和串行化,以允许开发人员根据应用的需求选择适当的隔离级别。

四个隔离级别
事务的四个隔离级别是指在数据库管理系统中,用于控制并发事务之间相互影响的不同级别。这些隔离级别分别是:

读未提交(Read Uncommitted):
事务可以读取其他未提交事务的数据。
可能导致脏读、不可重复读和幻读等问题。
读已提交(Read Committed):
事务只能读取已经提交事务所做的修改。
可以避免脏读,但仍可能出现不可重复读和幻读等问题。
可重复读(Repeatable Read):
事务在开始读取数据(事务开启)时,不允许其他事务对该数据进行修改。
解决了不可重复读问题,但仍可能存在幻读。
串行化(Serializable):
最高的隔离级别,确保事务按顺序执行,避免脏读、不可重复读和幻读等问题。
提供最高的数据一致性,但可能导致性能下降,因为事务需要等待其他事务释放锁。
脏读    ** 不可重复读**    幻读
Read Uncommited    √    √    √
Read Commited    ×    √    √
Repeatable Read    ×    ×    √
Serializable    ×    ×    ×
对应的是Up date操作    对应insert操作
图片来自: 事务的四种隔离级别详解_事务隔离级别-CSDN博客

脏读:一个事务读取另一个未提交的数据。

**不可重复读:**一个事务范围内两个相同的查询却返回了不同数据。

**幻读:**一个事务范围内两个相同的查询却返回了不同数据。对应的是插入操作。

数据库的常用锁
上锁了都可以直接通过select …from…查询数据,因为普通查询没有任何锁机制。

锁的粒度划分
1、表级锁(Table-level lock)
直接给整个表添加锁:

select * from student where name = 'tom' for update
1
1
2
InnoDB在使用过程中只要不通过索引检索数据时,全部是表锁。
开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低

2、行级锁(Record Locks)
InnoDB中给指定的行添加锁:

select * from student where id > 10 for update
1
1
2
InnoDB行锁是通过给索引上的索引项加锁来实现的,InnoDB只有通过索引条件检索数据,InnoDB才使用行级锁
行锁的劣势:开销大;加锁慢;会出现死锁
行锁的优势:锁的粒度小,发生锁冲突的概率低;处理并发的能力强

3、页级锁
页级锁是 MySQL 中比较独特的一种锁定级别,在其他数据库管理软件中并不常见。页级锁是对表中的页进行加锁,每个页的大小是固定的,一般为4KB
页级锁的颗粒度介于行级锁与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力同样也是介于上面二者之间。另外,页级锁和行级锁一样,会发生死锁。
页级锁主要应用于 BDB 存储引擎。

锁级别划分
1、共享锁(share lock,即S锁)
共享锁(S):又称读锁,允许一个事务去读取一行,阻止其他事务获得相同数据集的排它锁,若事务T对数据对象A加上S锁,则事务T可以读A,但不能修改A,其他事务只能对再对A加S锁,而不能加X锁,直到T释放A上的锁,这保证了其他事务可以读A,但在释放A上的S锁之前不能对A做任何修改。

我们有如下测试数据:

共享锁:

START TRANSACTION;
SELECT * FROM test WHERE id = 1 LOCK IN SHARE MODE;
1
2


别的线程是可以查询到数据的。

但加排他锁就查不到,因为排他锁与共享锁不能存在同一数据上。

2、排它锁 / 独占锁(exclusive lock,即X锁)
排它锁(X):又称写锁,允许获取排它锁的事物更新数据,阻止其他事务取得相同的数据集共享读锁和排它写锁,若事务T对数据对象A加上X锁,事物T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T 释放A上的锁

现在我们对id=1的数据行排他查询

排他锁:

START TRANSACTION;
SELECT * FROM test WHERE id = 1 FOR UPDATE;
1
2


可以看到开了排他锁查询和共享锁查询都会处于阻塞状态,因为id=1的数据已经被加上了排他锁,此处阻塞是等待排他锁释放。

3、意向锁
事物B对一行数据使用行锁,当有另一个事物A对这个表使用了表锁,那么这个行锁就会升级为表锁,事务A在申请行锁(写锁)之前,数据库会自动先给事务A申请表的意向排他锁。当事务B去申请表的写锁时就会失败,因为表上有意向排他锁之后事务B申请表的写锁时会被阻塞。

需要强调一下,意向锁是一种不与行级锁冲突的表级锁

死锁
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。如下图所示:

如下表

CREATE TABLE `test` (
  `id` int(20) NOT NULL,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1
2
3
4
5
表中数据有:

两个事务对一个表进行如下操作:

navicat创建两个查询

每个查询都一步一步执行

查询1:

START TRANSACTION;
select * from test where id = 3 for update;
insert into test(id, name) values(3, "王五"); 
1
2
3
查询2:

START TRANSACTION;
select * from test where id = 4 for update;
insert into test(id, name) values(4, "赵六"); 
1
2
3
会出现死锁


————————————————
版权声明:本文为CSDN博主「DecemberZero2」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_72075879/article/details/134937090文章来源地址https://www.toymoban.com/news/detail-756425.html

到了这里,关于事务的四个特性、四个隔离级别以及数据库的常用锁的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL的四个隔离级别对比

    最近在看MySQL的常见面试题, 简单记录一下. 主要为了保证ACID中的隔离性, 一致性是目的. 原子性, 隔离性, 持久性都是手段. 隔离级别 脏读(Dirty Read) 幻读(Phantom Read) 不可重复读(Non-repeatable Read) Read Uncommitted 可能发生 可能发生 可能发生 Read Committed 不会发生 可能发生 可

    2024年02月13日
    浏览(37)
  • 【数据库的四种隔离级别】

    在关系型数据库中,隔离级别是指多个事务并发执行时,彼此之间的隔离程度。数据库的四种隔离级别如下: 最低级别的隔离级别,一个事务可以读取到另一个事务未提交的数据,可能会出现脏读、不可重复读和幻读等问题。 一个事务只能读取到另一个事务已经提交的数据

    2024年02月13日
    浏览(50)
  • 数据库——事务,事务隔离级别

    什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行。 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误

    2024年02月11日
    浏览(43)
  • 数据库事务隔离级别

    读未提交、读已提交、可重复读、串行化 对事务中所有读写的数据加上读锁、写锁、范围锁。所以冲突的事务必须同步执行。 核心是只对事务中所有读写的数据加上读锁、写锁,不加范围锁。 相比于读已提交,由于对整个事务都加上了读锁,避免其他事务可以进行更新,进

    2024年02月08日
    浏览(42)
  • 数据库之事务隔离级别详解

    事务是一个原子操作,要么全部执行成功,要么全部执行失败。 事务的原子性确保一组逻辑操作,要么全部完成,要么完全不起作用。 执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的。 事务的隔离性是指在并发执行

    2024年02月07日
    浏览(69)
  • MySQL的事务特性、事务特性保证和事务隔离级别

            事务是指要么所有的操作都成功执行,要么所有的操作都不执行的一组数据库操作。 一、MySQL提供了四个事务特性,即ACID:          1. 原子性(Atomicity) :一个事务中的所有操作要么全部提交成功,要么全部回滚失败,保证事务的原子性。          2. 一

    2024年02月03日
    浏览(40)
  • 【后端面经-数据库】MySQL的事务隔离级别简介

    目录 0. 事务的概念 1. 三类问题 2. 事务隔离级别 3. 操作指令 4. 总结 5. 参考博文 事务指的是一连串的集中操作指令,一个事务的执行必须执行完所有的动作才能算作执行结束。事务具有四个特点,简记作 ACID : A -Atomicity: 原子性,事务的执行必须保证所有的动作都执行完毕;

    2024年02月08日
    浏览(47)
  • 事务——什么是事务,事务的特性,事务的隔离级别

            事务就是用户定义的一系列操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。 典型场景:银行转账 A 转账100元给B,A账户减少100元,B账户增加100元; 如果A转出失败或者B转入失败(任意一方失败)

    2024年02月10日
    浏览(49)
  • 聊一聊数据库事务的那些事(隔离级别,传播行为)

      我们平时使用事务的时候,可能脑子里面想到和事务有关的知识点无非就是,ACID,事务隔离级别那一套,使用的事务也就是是通过注解的形式,或者手动开启事务。更细致一点的问题或许没有深究下去,比如事务的传播行为,注解形式和手动事务的区别等,今天我们就这几

    2024年02月07日
    浏览(54)
  • 【Mysql数据库 第13章】MySQL的事务、事务的隔离级别、事务的保存点

    💖Spring中的创建对象的三种方式、第三方资源配置管理详细描述及使用(XML版完结篇) 💖Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇) 💖

    2023年04月20日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包