iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL事务介绍
  • 820
分享到

MySQL事务介绍

MySQL事务介绍 2019-11-07 05:11:18 820人浏览 绘本
摘要

什么是事务 事务的概念 从业务层面上来说,事务就是一个最小的不可分割的单元,通常一个事务对应的是一个完整的业务(比如银行的转账操作)。 为什么要有事务 仍以银行转账为例加以说明,比如我要从账号A转账100元到账号B,现在数据库有一

MySQL事务介绍

什么是事务

事务的概念

从业务层面上来说,事务就是一个最小的不可分割的单元,通常一个事务对应的是一个完整的业务(比如银行的转账操作)。

为什么要有事务

仍以银行转账为例加以说明,比如我要从账号A转账100元到账号B,现在数据库有一张表account,那么就意味着需要同时执行两条sql语句的更新:

update account set amt = amt-100 where acc_no = "A";
update account set amt = amt+100 where acc_no = "B";

以上两条SQL,第一条表示账号A余额减少100元,第二条SQL表示账号B余额增加100元,只有两条SQL都执行成功,才能被认为是转账成功。
我们假设第一条SQL执行成功了,第二条SQL执行失败,于是A账户的钱少了100,但是B账户的钱并没有增加,对于银行来说,这100元相当于凭空消失了,所以对于转账这个业务来说,这两条SQL是一个不可分割的整体,必须放在一块执行,要么都成功,要么都失败。
所以必须要由事务来进行控制。

如何开启/提交事务

每个事务都需要开启和提交(或回滚),在开启和提交(回滚)事务之间的操作,都被认为是一个事务的操作。也就是说,在同一个事务里的操作,如果该事务没有提交或回滚,那么其操作都只是在缓存里生效,而并没有在实际数据库中生效,只有当数据提交了之后,才会真正在数据库生效。
回滚事务是相对于提交事务而言的,提交事务是使事务中的操作在数据库生效,而回滚事务就是将数据库状态回滚到开启事务之前的状态。

开启事务

开启事务有以下几种不同的语法:

start transaction;
begin;
set autocommit =0;

以上三种语法都可以开启事务,其中第三种set autocommit =0;含义是关闭自动提交,也就意味着需要手动提交,在事务没有提交之前,都不会在数据库生效,也相当于开启了事务。

提交事务

提交事务的语法也很简单,只需要执行以下语句就可以了:

commit;
//或
commit work;

回滚事务

回滚语法也是简单的一句语法:

rollback;

接下来以一个具体的例子加以说明:
我在数据库里有这样一张表:

mysql> select * from test01;
+------+------+--------+--------+
| id   | name | passwd | inf    |
+------+------+--------+--------+
|    1 | zz   | 123456 | asdfgh |
+------+------+--------+--------+
1 row in set (0.04 sec)

接下来我们需要开启一个事务,在事务里添加一条数据,再开启另外一个会话,在另一个会话里,食物提交前和事务提交后分别访问该表,看看区别在哪里。

--开启事务
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

--插入数据
mysql> insert into test01 values(2, "aa", "123123", "worktest");
Query OK, 1 row affected (0.03 sec)

--在当前事务中查询,有两条数据
mysql> select * from test01;
+------+------+--------+----------+
| id   | name | passwd | inf      |
+------+------+--------+----------+
|    1 | zz   | 123456 | asdfgh   |
|    2 | aa   | 123123 | worktest |
+------+------+--------+----------+
2 rows in set (0.00 sec)

此时在另外一个会话中查询:

--在另外的事务中查询,只有一条数据
mysql> select * from test01;
+------+------+--------+--------+
| id   | name | passwd | inf    |
+------+------+--------+--------+
|    1 | zz   | 123456 | asdfgh |
+------+------+--------+--------+
1 row in set (0.00 sec)

可以发现,虽然在事务中已经执行了insert语句,但在其他的会话中,在没有提交之前,仍然没有生效,查看到的仍然只有一条。
但是当在事务中执行以下语句后:

mysql> commit;
Query OK, 0 rows affected (0.03 sec)

再次查询,发现insert的记录就能够查询到了:

mysql> select * from test01;
+------+------+--------+----------+
| id   | name | passwd | inf      |
+------+------+--------+----------+
|    1 | zz   | 123456 | asdfgh   |
|    2 | aa   | 123123 | worktest |
+------+------+--------+----------+
2 rows in set (0.01 sec)

回滚亦是同理,这里就不做演示了。不过仍然可以用转账的例子来说明一下,现在将转账执行的两条SQL放在一个事务中执行,第一条A账户减去100元,第二条B账户增加100元,假设第一条语句执行成功,第二条语句执行失败,我们在代码的逻辑实现里,只需要加上当有任意一条SQL语句执行失败,事务回滚,则不会出现凭空消失100元或凭空增加100元的情况了。

事务的四大特性(ACID)

事务的四大特性,也就是俗称的ACID,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

原子性

所谓原子性,就是一个事务中,所有的操作都是最小单元,不可分割的。要么全部完成,要么全部不完成,不会执行一半然后结束。

一致性

一致性是指事务开始之前和结束之后,数据库的完整性没有被破坏,即事务中的所有SQL语句的DML操作,要么都成功,要么都失败,不会既有成功也有失败的情况出现。

隔离性

隔离性是指每个事务都是相对隔离的,即A事务不会对B事务造成影响。从上面的例子中也能看出这一点,A事务已经插入了数据,但是B事务中并不能访问到,也就是说每个事务之间是相互隔离开的。

持久性

持久性是说,事务一旦提交,对数据的修改就是持久有效的,和当前事务再没有任何关系。

事务隔离级别

事务隔离级别的提出,主要是为了解决脏读、幻读和不可重复读的问题。
脏读:

  • 事务A读取了事务B的数据,然后B回滚,A读到的数据就是脏数据;

不可重复读:

  • 事务A多次读取同一数据,但是事务B在事务A读取的过程中,对数据进行了操作,导致事务A前后两次读取到的数据不一致;

幻读:

  • 事务A对数据进行DML操作,在这个过程中同时有事务B也对该数据进行了新增操作,导致事务A执行完后发现并不是所有的数据都改变了过来,就像出现了幻觉,因此叫幻读。

以例子来说明:
脏读
如上图所示,一开始账户金额为0,开启事务B后,执行更新操作,金额修改为1000,此时事务A去读到了这个1000,但是之后事务B将事务回滚了,实际上金额仍为0,所以其实事务A读到的事务是不准确的,属于“脏数据”,这就是脏读。

不可重复读
在这个例子中,事务B开启后,先将金额更新为1000,此时A去读,读到了1000,但是之后B又将金额更新为了500,然后提交数据,此时金额500 才是最终的数据,A再去读,发现金额已经变成了500,造成了前后两次读取不一致,这就是不可重复读。

上例中,同时开启了两个事物,事物A对account表中所有账户的金额进行了置0操作,但是在事务A开启的过程中,事务B在account表中插入了一条金额为1000的数据,然后,事务A先提交,再事务B提交,如果这个时候去查询account表,发现会有一条金额为1000的记录,因为该记录是由事务B插进去的,所以没有更新到,此时就会造成幻读。

幻读
所谓事务隔离级别,就是为了解决以上三种情况而提出的。

读未提交(read uncommitted)

最低的一种隔离级别,该隔离级别可能会造成脏读。当然也可能会出现不可重复读和幻读。
即:A事务未提交的数据,B可以读取到。

读已提交(read committed)

该隔离级别高于read uncommitted,可以有效解决脏读,但是仍然不能避免不可重复度和幻读。
即:A未提交的数据,B读取不到,B只能读取得到A已经提交的数据。

可重复读(repeatable read)

从名字也知道,该隔离级别可以解决不可重复读。隔离级别要高于read committed,但是不能解决幻读。这是Mysql默认的隔离级别。
即:A提交后的数据,B还是读取不到。

串行化(serializable)

串行化是最高的隔离级别,可以有效解决“幻读”。这种隔离级别吞吐量太低,因为当前事务开启时,别的事务只能等待,非常影响效率,一般很少使用。
即:A开启事务,B只能排队等待。

总结起来,大约如下表所示:

隔离级别 脏读 不可重复读 幻读
read uncommitted 可能 可能 可能
read committed 不可能 可能 可能
repeatable read 不可能 不可能 可能
serializable 不可能 不可能 不可能

如何设置事务隔离级别

使用一句话即可:

SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL 

GLOBAL是指隔离级别全局有效,SESSION当前会话有效。
如当前会话设置为读未提交:

SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted;

当前会话设置为读已提交:

SET SESSION TRANSACTION ISOLATION LEVEL read committed;

当前会话设置为可重复读:

SET SESSION TRANSACTION ISOLATION LEVEL repeatable read;

当前会话设置为序列化:

SET SESSION TRANSACTION ISOLATION LEVEL serializable;

如何查看事务隔离级别:

查看当前会话隔离级别:

select @@tx_isolation;

查看全局隔离级别:

select @@global.tx_isolation;
您可能感兴趣的文档:

--结束END--

本文标题: MySQL事务介绍

本文链接: https://www.lsjlt.com/news/5291.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql事务详细介绍
    目录简介事务四个特性事务隔离级别验证MVCC当前读快照读当前读、快照读、MVCC关系mvcc 解决的问题MVCC实现原理可见性规则简介 事务是由一组sql语句组成的逻辑处理单元 事务...
    99+
    2024-04-02
  • MySQL的事务隔离级别介绍
    本篇内容介绍了“MySQL的事务隔离级别介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是事务?数据...
    99+
    2024-04-02
  • 【MySQL基础教程】事务详细介绍
    前言 本文为 【MySQL基础教程】事务 相关知识,下边将对事务简介,事务操作(包括:未控制事务,控制事务),事务四大特性,并发事务问题,事务隔离级别等进行详尽介绍~ 📌博主主页:小...
    99+
    2023-09-04
    mysql java 数据库
  • MySQL事务的介绍以及示例分析
    这篇文章给大家介绍MySQL事务的介绍以及示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.什么是事务:事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时事务是做为...
    99+
    2024-04-02
  • mysql并发事务控制的过程介绍
    本篇内容主要讲解“mysql并发事务控制的过程介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql并发事务控制的过程介绍”吧!1、单版本控制锁。锁以独占的方式确保事务在只有一个版本的情况...
    99+
    2023-06-20
  • MySQL事务的概念以及事务隔离级别介绍
    本篇内容主要讲解“MySQL事务的概念以及事务隔离级别介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL事务的概念以及事务隔离级别介绍”吧!先简单介绍...
    99+
    2024-04-02
  • SQLServer中的事务介绍
    事务全部是关于原子性的。原子性的概念是指可以把一些事情当做一个单元来看待。从数据库的角度看,它是指应全部执行或全部都不执行的一条或多条语句的最小组合。为了理解事务的概念,需要能够定义...
    99+
    2024-04-02
  • Go GORM 事务详细介绍
    目录禁用默认事务事务嵌套事务手动事务一个特殊的示例SavePoint、RollbackTo禁用默认事务 为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果...
    99+
    2024-04-02
  • Spring事务的详细介绍
    本篇内容介绍了“Spring事务的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言Spring事务管理我相信大家都用得很多,但可能...
    99+
    2023-06-04
  • Sql Server中事务的介绍
    这篇文章主要介绍“Sql Server中事务的介绍”,在日常操作中,相信很多人在Sql Server中事务的介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Sql Serv...
    99+
    2024-04-02
  • MySQL事件调度器的用法介绍
    本篇内容主要讲解“MySQL事件调度器的用法介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL事件调度器的用法介绍”吧! 事件调度器有时也可称为临时...
    99+
    2024-04-02
  • Oracle 10046事件 介绍(一)
    做Oracle方面的工作时间长了,经常会听人提起10046事件,尤其是涉及到SQL调优的时候更甚。那10046事件到底是什么呢,先做一个简单的介绍。1、什么是10046事件  10046事件是Or...
    99+
    2024-04-02
  • MySQL分区介绍
    不论创建何种类型的分区,如果表中存在主键或唯一索引时,分区列必须是唯一索引的一个组成部分 mysql> create table t1(     -> col1 i...
    99+
    2024-04-02
  • MySQL事件调度器Event Scheduler是实例介绍
    这篇文章主要介绍“MySQL事件调度器Event Scheduler是实例介绍”,在日常操作中,相信很多人在MySQL事件调度器Event Scheduler是实例介绍问题上存在疑惑,小编查阅了各式资料,整...
    99+
    2024-04-02
  • MySQL权限表介绍
    MySQL权限表存放在MySQL数据库里,由mysql_install_db脚本初始化。这些MySQL权限表分别为“user、db、table_priv、 columns_priv、proc_priv和ho...
    99+
    2024-04-02
  • MySQL MRR和ICP介绍
    MRR 「Multi-Range Read」初步理解 对where条件拆分,减少通过索引查到过多无用的数据;查询索引页叶子节点的主键ID后不是直接读取数据,而是把满足条件的主键ID进行排序,然...
    99+
    2024-04-02
  • MySQL的安装介绍
    本篇内容介绍了“MySQL的安装介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MySQL 安装本教程的...
    99+
    2024-04-02
  • sqlserver中的事务和锁的详细介绍
    本篇内容主要讲解“sqlserver中的事务和锁的详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“sqlserver中的事务和锁的详细介绍”吧!一、脏读、...
    99+
    2024-04-02
  • jQuery中的常用事件介绍
    一、jQuery事件的分类 jQuery事件是对JavaScript事件的封装,常用事件分类如下: 1、基础事件 window事件。鼠标事件。键盘事件。表单事件。 2、复合事件是多个...
    99+
    2024-04-02
  • jquery事件绑定方法介绍
    一、bind() bing()用来绑定事件,例如: 二、unbind() unbind()用来解除事件的绑定。例如: 三、on() on()方法用来绑定事件,例如: 四、off...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作