首页 > 数据库 >Mysql的事务

Mysql的事务

时间:2024-04-05 16:59:51浏览次数:24  
标签:事务 transaction users isolation age Mysql name

MySQL的事务(Transaction)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务能把数据库从一个一致性状态转变为另一个一致性状态。

1 事务得特性

  • A/Atomicity:原子性
  • C/Consistency:一致性
  • I/Isolation:独立性/隔离性
  • D/Durability:持久性

1.1 原子性

开启事务中得命令要不全部执行成功,要不全部执行失败,事务中得操作可以看作是一个原子操作不能分割。例如A给B转账,A-100 B+100,要不全部成功了要不就全部失败了,不存在但单独A成功或者B单独成功。

1.2 一致性

一致性表明事务发生得前后,数据是一致得。比如A给B转账,转账前后得A+B得总金额都是保持不变得,虽然转账导致了A和B得金额发生了变化,但是总得金额在前后保持一致性。

1.3 隔离性

两个事务之间的是相互隔离的,相互不干扰。MySQL中存在四种隔离等级

  • 读未提交:一个事务能读到另外事务未提交的数据

  • 读已提交:一个事务可以读到另一个事务已经提交的数据

  • 可重复读:在该事务中每次读取的数据都是一致的

  • 序列化/串行化:串行执行MySQL的命令。

1.4 持久性

持久性表示MySQL的数据会写入到磁盘做持久化处理。

2 Mysql中的事务操作

MySQL默认自动开启事务的,默认状态下一条语句就是一个事务,更改的Sql语句执行完成之后事务默认是自动提交的。

-- 查询是否开启自动提交
show variables like 'autocommit';

在这里插入图片描述

而且事务是基于连接的,创建了一个MySQL的连接会从MySQL连接池中分配一个线程,而开启的事务是基于本次的连接,操作不同的表数据可以加入到同一个事务中。

  • start transaction | begin | begin work:开启一个事务
  • commit:提交一个事务
  • rollback:回滚一个事务
-- 创建学生表
CREATE TABLE students (
	id INT auto_increment NOT NULL,
	stu_no varchar(100) NULL COMMENT '学号',
	name varchar(100) NULL COMMENT '学生名字',
	age INT NULL COMMENT '学生年龄',
	class_id INT NULL COMMENT '班级id',
	CONSTRAINT students_PK PRIMARY KEY (id)
);

--插入学生数据
INSERT INTO students (stu_no, name, age, class_id) VALUES
('1', '小红', 10, 1),
('2', '小蓝', 11, 2),
('3', '小黑', 13, 3),
('4', '小黑', 14, 1);
--示例1 rollback回滚事务
--窗口开启事务1
start transaction;
update students set age=100 where name="小红";
--窗口开启事务2
start transaction;
select * from students;
--事务1回滚
rollback;

在这里插入图片描述
在这里插入图片描述

--commit提交事务
start transaction;
update students set age=100 where name="小红";
commit;

在这里插入图片描述

--设置事务的回滚点
start transaction;
update students set age=100 where name="小黑";
savepoint update1;
update students set age=100 where name="小红";
savepoint update2;
update students set age=100 where name="不存在数据";
rollback to update1;
commit;

在这里插入图片描述

3 事务中发生的问题

3.1 脏写

AB同时开启事务,在同时刻同时对一个数据进行写操作。可能存在

  1. A更改成功了,但是B失败进行回退的时候,把A修改的数据还原了
  2. A更改成功,B也更改成功,但是B提交,A在提交的时候把B的数据覆盖了。

上面的两种情况都会出现MySQL数据的脏写问题。

3.2 脏读

在这里插入图片描述
一个事务2在执行过程读取到事务1未提交的数据,就是脏读,如果事务1出现异常回退,数据1会还原,而事务2获取到的数据就时脏数据。

3.3 不可重复读

在这里插入图片描述
如果事务2在第一次读取数据时事务还未提交,第二次读取时事务1提交了,会产生两个读取的结果不同,也就是说事务2读取事务1的已提交的内容,导致不可重复读的问题。

3.4 幻读

在这里插入图片描述
事务2在操作一堆数据的时候,事务1插入了一条数据,提交,明明没有数据为说存在数据,像是幻觉,这就是幻读。

4 MySQL的隔离级别

4.1 数据准备

-- 创建学生表
CREATE TABLE users (
	id INT auto_increment NOT NULL,
	user_no varchar(100) NULL COMMENT '用户编号',
	name varchar(100) NULL COMMENT '用户名字',
	age INT NULL COMMENT '用户年龄',
	CONSTRAINT students_PK PRIMARY KEY (id)
);

--插入学生数据
INSERT INTO users (user_no, name, age) VALUES
('1', '小红', 10),
('2', '小蓝', 11),
('3', '小黑', 13),
('4', '小黑', 14);

4.2 读未提交

事务1事务2
start transaction;start transaction;
update users set age=age+1;update users set age=age+1;
commit;commit;

在这里插入图片描述
在这里插入图片描述
如图所示,两个事务中修改同数据的时候会加一个互斥锁,当事务1获取锁时,事务2一致等待事务1的写互斥锁,当事务1完成时才释放锁,事务2获取了写互斥锁才能将数据写入。

事务1事务2
SELECT @@transaction_isolation;SELECT @@transaction_isolation;
set global transaction isolation level read uncommitted;set global transaction isolation level read uncommitted;
exitexit
mysql -uroot -p 123456mysql -uroot -p 123456
use test;use test;
SELECT @@transaction_isolation;SELECT @@transaction_isolation;
start transaction;
update users set user_no=100 where name=“小红”;
select * from users where name=“小红”;
rollback;

在这里插入图片描述
读未提交利用写互斥锁解决了数据库中的脏写的问题,但是依旧存在脏读、不可重复度和幻读问题

4.3 读已经提交

事务1事务2
set global transaction isolation level read committed;set global transaction isolation level read committed;
exitexit
mysql -uroot -p 123456mysql -uroot -p 123456
use test;use test;
SELECT @@transaction_isolation;SELECT @@transaction_isolation;
start transaction;start transaction;
select * from users where name=“小红”;
update users set age=200 where name=“小红”;
commit;
select * from users where name=“小红”;
commit;
在这里插入图片描述

读已经提交 通过MVCC多版本并发控制的技术解决了脏读的问题,但是依旧存在不可重复读幻读的问题。

读已提交中的MVCC机制相当于事务第一次读取数据创建一个ReadView(相当于快照),读取原本表中上一次提交的老数据。其他事务操作此数据的事务提交后此时MVCC机制又会创建一个新的ReadView,然后读取到最新的已提交的数据。

4.4 可重复读

-- 设置用户编号为唯一索引
alter table users add unique index un_no(user_no);
事务1事务2
set global transaction isolation level repeatable read;set global transaction isolation level repeatable read;
exitexit
mysql -uroot -p123456mysql -uroot -p123456
use test;use test;
SELECT @@transaction_isolation;SELECT @@transaction_isolation;
start transaction;start transaction;
select * from users where name=“小红”;
update users set age=300 where name=“小红”;
commit;select * from users where name=“小红”;
start transaction;
insert into users(user_no, name, age) values (“6”, “小青”, 10);
commit;select * from users;
insert into users(user_no, name, age) values (“5”, “小黄”, 12);

在这里插入图片描述
可重复读 解决了不可重复读的问题,但是依旧存在幻读的现象。

可重复读依旧是利用mvcc来解决不可重复读的问题,在读已提交中,一个事务中每次查询数据时,都会创建一个新的ReadView,然后读取最近已提交的事务数据,因此就会造成不可重复读的问题。而在可重复读级别中,则不会每次查询时都创建新的ReadView,而是在一个事务中,只有第一次执行查询会创建一个ReadView在这个事务的生命周期内,所有的查询都会从这一个ReadView中读取数据,从而确保了一个事务中多次读取相同数据是一致的,也就是解决了不可重复读问题。

innoDB的默认隔离级别是可重复读

4.5 串行化

事务1事务2
set global transaction isolation level serializable;set global transaction isolation level serializable;
exit
mysql -uroot -p123456
use test;
SELECT @@transaction_isolation;SELECT @@transaction_isolation;
start transaction;start transaction;
select * from users;
insert into users(user_no, name, age) values (“6”, “小青”, 10);

在这里插入图片描述
在这里插入图片描述
这个隔离级别是最高的级别,处于该隔离级别的MySQL绝不会产生任何问题,因为从它的名字上就可以得知:序列化意思是将所有的事务按序排队后串行化处理,也就是操作同一张表的事务只能一个一个执行,事务在执行前需要先获取表级别的锁资源,拿到锁资源的事务才能执行,其余事务则陷入阻塞,等待当前事务释放锁。

标签:事务,transaction,users,isolation,age,Mysql,name
From: https://blog.csdn.net/weixin_43413871/article/details/137332709

相关文章

  • 关于MySQL数据库的几个简单的入门代码注释
    不是很全,是我刚开始学习数据库时记的笔记%FOUND判断游标有效性%ROWTYPE行数据类型%属性:=赋值符号1ISTABLEOF21、2类型一样ABS系统自带函数绝对值ALL()比所有都ANY()任意一个(some用法意思一样)AS命别名,连接ASC升序AVG()函数求平均数BEGIN执行部分BULKCOLLECT......
  • java计算机毕业设计(附源码)优乐帮育儿系统(ssm+mysql+maven+LW文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在当今社会,随着生活节奏的加快和社会竞争的日益激烈,父母面临着巨大的育儿压力。育儿不再仅仅是满足孩子的基本生理需求,更涉及到心理、教育、健康等多方面......
  • java计算机毕业设计(附源码)优书校园平台(ssm+mysql+maven+LW文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在信息技术飞速发展的今天,教育领域亦紧跟时代步伐,逐渐实现数字化转型。传统的教育资源分配和学习方式正面临着重大的变革,其中,优书校园平台作为这一转型的......
  • MySQL数据库分组查询group by
    1.DDL建表CREATETABLE`result`(`rid`int(11)NOTNULLAUTO_INCREMENTCOMMENT'成绩编号',`testName`varchar(255)DEFAULTNULLCOMMENT'测试名称',`score`double(4,2)DEFAULTNULLCOMMENT'成绩',`studentId`int(11)DEFAULTNUL......
  • Mysql
    Mysql其实时DBMS软件系统,Mysql并不是一个数据库,而是用户与数据库的桥梁Mysql是一种关系型数据库,关系型数据库的存储模型很像Excel,用行和列来组织数据Mysql的结构Mysql语句创建数据库CREATEDATABASE数据库名;用来创建一个数据库,后面的分号必须要使用哪一个数据库USE数......
  • ssm基于面向对象的学生事务处理系统分析与设计论文
    摘要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本学生事务处理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理......
  • MySQL面试题系列-8
    MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件之一。mysql的全复制、半复制、异步复......
  • mysql双机热备
    MySQL双机热备:保障数据库高可用性的关键技术在当今信息化社会中,数据库作为企业信息系统的核心组成部分,其高可用性和数据安全性至关重要。MySQL作为广泛应用的开源关系型数据库管理系统,其双机热备技术成为保障数据库稳定运行的关键手段。本文将深入探讨MySQL双机热备的原理、实......
  • [MySQL]存储过程
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18032044出自【进步*于辰的博客】存储过程的细节很多,而在实际工作中又未必都能涉及这些细节,工作时间一长,就可能忘记,于是特来写这篇文章,既是为自己做个笔记,也是跟大家分享存......
  • java计算机毕业设计(附源码)影院订票app(ssm+mysql+maven+LW文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在数字化时代,人们对于娱乐消费的方式和习惯正在发生着翻天覆地的变化。随着智能手机的普及以及移动互联网技术的飞速发展,线上订票系统成为了人们生活中不......