一文带你了解MySQL中的事务

 更新时间:2023年02月17日 10:22:04   作者:阳862  
事务处理可以用来维护数据库的完整性,保证成批的sQL语句要么全部执行,要么全部不执行。本文将通过一些简单的示例带大家了解一下MySQL中的事务,希望对大家有所帮助

一.什么是事务

  • 在MySQL中的事务(Transaction)是由存储引擎实现的,在MySQL中,只有InnoDB存储引擎才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的sQL语句要么全部执行,要么全部不执行。
  • 事务用来管理DDL、DML、DCL操作,比如insert,update,delete语句,默认是自动提交的。

比如:在银行转账时,必须保证转账绝对安全,这时需要事务参与

 -- id为1的账户转账给id为2的账户
update account set money=money -200 where id=1;
update account set money=money +200 where id=2;

思考

假如在第一次update之后,出现了意外、异常,没有执行第二次update,这时转账是否会出现异常?

二.事务操作

MySQL的事务操作主要有以下三种

1.开启事务:start Transaction

  • 任何一条DML语句( insert、update、delete)执行,标志事务的开启
  • 命令:BEGIN 或 START TRANSACTION

2.提交事务:commit Transaction

  • 成功的结束,将所有的DML语句操作历史记录和底层硬盘数据来一次同步
  • 命令:COMMIT

3.回滚事务

  • 失败的结束,将所有的DML语句操作历史记录全部清空
  • 命令:ROLLBACK

之前的所有SQL操作其实也有事务,只是MysQL自动帮我们完成的,每执行一条SQL时MySQL就帮我们自动提交事务,因此如果想要手动控制事务,则必须关闭MySQL的事务自动提交。

在MySQL中直接用SET来改变MySQL的自动提交模式:

演示

create database test_transaction;
use test_transaction;
 
create table account(
	id int primary key,
	name varchar(20),
	money double
 
);
 
insert into account values(1,'张三',1000),(2,'李四',1000);
 
-- 设置MySQL的事务为手动提交(关闭自动提交)
select @@autocommit;-- 输出1指开启
set autocommit=0;
 
-- 模拟账户转账
-- 开启事务
begin;
update account set money=money -200 where id=1;
update account set money=money +200 where id=2;
-- 提交事务
commit;
 
-- 回滚事务
rollback;
 
select * from account a ;

不提交直接查询的结果是

但是

在图形上数字需要提交后才可以正常显示

这是因为select查的是最新的内存上的变化

当开启事务还未提交之前,执行回滚事务语句,那么就会撤销开启事务中执行的语句

小结

begin开启后要么commit提交落盘要么rollback回滚落盘,先运行开启,在执行SQL语句,最后执行commit或者rollback

三.事务的特性

1.原子性

事务是一个不可分割的整体,事务开始后的所有操作,要么全部完成,要么全部不做

2.一致性

系统从一个正确的状态,迁移到另一个正确的状态

3.隔离性

每个事务的对象对其他事务的操作对象互相分离,事务提交前对其他事务不可见

4.持久性

事务一旦提交,则其结果是永久性的

四.事务的隔离级别

概述

lsolate,顾名思义就是将事务与另一个事务隔离开,为什么要隔离呢?如果一个事务正在操作的数据被另一个事务修改或删除了,最后的执行结果可能无法达到预期。如果没有隔离性还会导致其他问题。

如上图,越往上两个事务之间的关联程度越紧密,越往下越安全但效率越低。

四种隔离级别

1、读未提交(Read uncommitted)

一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证,会造成脏读。

2、读已提交(Read committed)

一个事务要等另一个事务提交后才能读取数据,可避免脏读的发生,会造成不可重复读。

3、可重复读(Repeatable read)

就是在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读的发生,但是会造成幻读。

4、串行(Serializable)

是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

Mysql的默认隔离级别是Repeatable read

事务隔离级别脏读不可重复读幻读
读未提交(Read uncommitted)
读已提交(Read committed)
可重复读(Repeatable read)
串行(Serializable)

脏读、不可重复读、幻读

脏读:所谓的脏读,其实就是读到了别的事务回滚前的脏数据。比如事务B执行过程中修改了数据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读。

不可重复读:事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。

幻读:事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。

不可重复读和幻读比较:

两者有些相似,但是前者针对的是update或delete,后者针对的insert。

操作

-- 查看隔离级别
show variables like '%isolation%';
 
-- 设置隔离级别
/*
 set session transaction isolation level 级别字符串
 级别字符串:read uncommitted、read committed、repeatable read、serializable
 */
 
-- 设置read uncommitted 
set session transaction isolation level read uncommitted;
-- 这种隔离级别会引起脏读,A事务读取到B事务没有提交的数据
 
-- 设置read committed
set session transaction isolation level read committed;
-- 这种隔离级别会引起不可重复读,A事务在没有提交事务之前,可看到数据不一致
 
 
-- 设置repeatable read(MysQ默认的)
set session transaction isolation level repeatable read;
-- 这种隔离级别会引起幻读,A事务在提交之前和提交之后看到的数据不一致
 
-- 设置serializable
set session transaction isolation level serializable;
-- 这种隔离级别比较安全,但是效率低,A事务操作表时,表会被锁起,B事务不能操作。

到此这篇关于一文带你了解MySQL中的事务的文章就介绍到这了,更多相关MySQL事务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql登录报错提示:ERROR 1045 (28000)的解决方法

    mysql登录报错提示:ERROR 1045 (28000)的解决方法

    这篇文章主要介绍了mysql登录报错提示:ERROR 1045 (28000)的解决方法,详细分析了出现MySQL登陆错误的原因与对应的解决方法,需要的朋友可以参考下
    2016-04-04
  • 阿里云配置MySQL-server 8.0远程登录的实现

    阿里云配置MySQL-server 8.0远程登录的实现

    我们经常会碰到需要远程访问数据库的场景,本文主要介绍了阿里云配置MySQL-server 8.0远程登录的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • MySQL常用慢查询分析工具详解

    MySQL常用慢查询分析工具详解

    这篇文章主要介绍了MySQL常用慢查询分析工具详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • mysql数据校验过程中的字符集问题处理

    mysql数据校验过程中的字符集问题处理

    在日常应用中,我们经常会遇到在不同的字符集的数据库直接进行数据的导入导出操作,针对这个问题,我们来进行讨论下
    2014-05-05
  • MySQL select查询之LIKE与通配符用法

    MySQL select查询之LIKE与通配符用法

    这篇文章主要介绍了MySQL select查询之LIKE与通配符用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • win10下mysql5.7.21解压版安装教程

    win10下mysql5.7.21解压版安装教程

    这篇文章主要为大家详细介绍了win10下mysql5.7.21解压版安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 详解一条update语句是怎样执行原理解析

    详解一条update语句是怎样执行原理解析

    这篇文章主要为大家介绍了详解一条update语句是怎样执行原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • MySQL中的JSON字段List成员检查

    MySQL中的JSON字段List成员检查

    这篇文章主要介绍了MySQL中的JSON字段List成员检查,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • IDEA连接mysql又报错!Server returns invalid timezone. Go to tab and set serverTimezone  prope的问题

    IDEA连接mysql又报错!Server returns invalid timezone. Go to tab an

    这篇文章主要介绍了IDEA连接mysql又报错!Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' prope问题,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2020-05-05
  • MySQL中增量备份的几种实现方法

    MySQL中增量备份的几种实现方法

    MySQL数据库的增量备份是确保数据安全和可恢复性的关键策略,本文就来介绍一下如何实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01

最新评论