【MySQL】MySQL的事务

news/2024/7/5 1:51:54

事务

目录

  • 事务
    • 1.1 为什么使用事务?
    • 1.2 事务的概念
    • 1.3 使用
  • 2.事务的基本特性
    • 2.1 脏读问题:
    • 2.2 不可重复读:
    • 2.3 幻读问题:
    • 2.4 MySQL中事务的隔离级别

1.1 为什么使用事务?

准备测试表:

drop table if exists accout;
create table accout(id int primary key auto_increment,name varchar(20) comment '账户名称',money decimal(11,2) comment '金额'
);
insert into accout(name, money) values
('妈妈', 500),
('你', 500);

比如说,妈妈给你的账户转账500元:

 --妈妈账户减少500
update accout set money=money-500 where name = '妈妈';
-- 四十大盗账户增加2000
update accout set money=money+500 where name = '你';

假如在执行以上第一句SQL时,出现网络错误,或是数据库挂掉了,妈妈的账户会减少500,但是
你的的账户上就没有了增加的金额

解决方案:使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败。

1.2 事务的概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

1.3 使用

  1. 开启事务:start transaction;
  2. 执行多条SQL语句
  3. 回滚或提交:rollback/commit;
    说明:rollback即是全部失败,commit即是全部成功。
start transaction;
-- 妈妈账户减少500
update accout set money=money-500 where name = '妈妈';
-- 四十大盗账户增加2000
update accout set money=money+500 where name = '你';
commit;

2.事务的基本特性

  1. 原子性:要么全部执行完,要么一个都不执行,任务不可以再被细分了
  2. 一致性:在事务执行之前,和执行之后,数据库中的数据都得是合理合法的
    例如,你转账完了之后,不能够出现这种账户为负数的情况
  3. 持久性:事务一旦提交了之后,数据就持久化存储起来了 数据就写入到硬盘了
  4. 隔离性:隔离性描述的是,事务并发执行时候,产生的情况
    当并发执行多个事务,尤其是这多个事务在尝试修改/读取同一份数据,这个时候就容易出现一些问题,事务的隔离性,就是在解决上述问题~~

关于隔离性问题,可以引入以下几个概念:

2.1 脏读问题:

事务A在对某个数据进行修改.修改的同时,事务B去读取了这个数据,此时事务B读到的很可能是一个"脏数据"(这个数据是一个临时的结果,而不是最终的结果)

出现脏读的问题,原因就是事务和事务之间,没有进行任何的隔离,加上了一些约束限制,就可以有效的避免脏读问题 。

处理脏读问题:
处理脏读:给写操作加锁:在修改的过程中,别人不能读了.(加锁的状态)等修改完了之后,别人才能读. (解除加锁)

一旦加了这个写锁之后,意味着事务之间的隔离性就高了,并发性就降低了

2.2 不可重复读:

在一个事务中,包含了多次的读操作,这多次的读操作读出来的结果不一致。
刚才约定的是,写的过程中不能读,没说读的过程中不能写,这就产生了不可重复读问题

通过给读操作也加锁,这就解决了不可重复读的问题,意味着事务之间的并发性又降低了,隔离性又提高了。

并发性和隔离性二者是对立的,不可得兼的

2.3 幻读问题:

一个事务执行过程中进行多次查询,多次查询的结果集不一样(多了一条或者少了一条)
这个操作算是一种特殊的不可重复读 !

  • 解决幻读问题:彻底串行化执行
    也就是在读的操作过程中,严格遵守不写入操作。
    此时 :隔离性最高,并发程度最低.数据最可靠,速度最慢

此时我们就可以根据实际需要来调整数据库的隔离级别,通过不同的隔离级别,也就控制了事务之间的隔离性,也就控制了并发程度。

2.4 MySQL中事务的隔离级别

  1. .read uncommitted:允许读取未提交的数据.并发程度最高,隔离程度最低.会引入脏读+不可重复读+幻读问题
  2. read committed:只允许读取提交之后的数据.相当于写加锁.并发程度降低了一些,隔离程度提高了一些.解决了脏读,会引入不可重复读+幻读.
  3. repeatable read:相当于给读和写都加锁.并发程度又降低了.隔离程度又提高了.解决了脏读和不可重复度,会引入幻读.
  4. serializable :串行化.并发程度最低(串行执行)隔离程度最高.解决了脏读,不可重复度,幻读问题,但是执行速度最慢。

我们可以通过修改my.ini这个配置文件,来设置当前的隔离级别,根据实际需求场景,再来决定使用哪种隔离级别!

  • over~

http://lihuaxi.xjx100.cn/news/283887.html

相关文章

html5日期转long

正确:日期,时间均是实时的 var inDate $("#inDate").val().trim(); if(inDate ! "") {inDate inDate.split(-);var d new Date();d.setFullYear(inDate[0]);d.setMonth(inDate[1] 1);d.setDate(inDate[2]);inDate d.getTime();…

深度解析:特斯拉「最强」自动驾驶芯片?

作者 | 唐杉来源 | StarryHeavenAbove在近日结束的Tesla Autonomy活动中,Tesla非常“大方”的介绍了自己的Full Self-Driving (FSD) Computer从系统到芯片的很多细节。从芯片来看,其“透明度”超过了除Google第一代TPU之外所有的AI相关芯片。实际上&…

超全面的Linux基础知识的梳理

我们是谁?我们为什么要学习Linux?我们想达到什么样的目标?作为一名LINUX运维小白,每日每夜面对着这些 linux生产环境,如何胜任?在今天这篇文章中,我们将分享一些Linux基础性的东西。这篇文章只是…

一个妹子的美团面试经历,历经 4 轮 2 小时,成功拿到 Offer

点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达来源:只爱羽毛球的程序媛blog.csdn.net/csuliyajin2012/article/details/49430659美团,我是在拉勾网上投的简历,之前也投过一次,简历都没通过删选…

【MySQL】Java中的 JDBC 编程

目录💦前言 : 数据库编程的必备条件1. Java的数据库编程:JDBC1.1 JDBD使用步骤4. JDBC使用4.1创建数据源4.2 与数据库服务器建立连接4.3 操作数据库. 以插入数据为例5.数据库操作(CURD 增删改查)5.1 插入(e…

写代码这条路,能走多远?阿里算法专家告诉你

作者 | 张知临 (花名:妙临),阿里巴巴算法专家,专注于计算广告领域的策略研究和机制设计,包括调价机制、合约分配、多目标优化、用户体验建模等,并将上述策略和机制以及DL、RL等技术应用在淘宝、优酷等场景中。职场危机…

20道常见初级Java面试题

1、面向对象的特征有哪些方面?答:面向对象的特征主要有以下几个方面:- 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节…

mysql 索引合并

索引合并是mysql底层为我们提供的智能算法。本文就介绍了mysql 索引合并的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 索引合并是mysql底层为我们提供的智能算法。了解索引合并的算法&#xff0c…