广告
返回顶部
首页 > 资讯 > 数据库 >一些关于MySQL事务的基础知识
  • 142
分享到

一些关于MySQL事务的基础知识

2024-04-02 19:04:59 142人浏览 独家记忆
摘要

下面讲讲关于Mysql事务的基础知识,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完mysql事务的基础知识这篇文章你一定会有所受益。 1、事务的基本语法<!--

下面讲讲关于Mysql事务的基础知识,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完mysql事务的基础知识这篇文章你一定会有所受益。 

1、事务的基本语法

<!--创建表-->
mysql> create table bank
    -> (
    -> name varchar(25),
    -> money float
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> insert into bank values('lu','1000'),('qi','5000');   <!--插入数据-->
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

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

mysql> update bank set money=money - 1000 where name='qi';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update bank set money=money+1000 where name ='lu';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from bank;           <!--查看数据--> 
+------+-------+
| name | money |
+------+-------+
| lu   |  2000 |
| qi   |  4000 |
+------+-------+
2 rows in set (0.00 sec)
mysql> rollback;              <!--回滚事务-->
Query OK, 0 rows affected (0.01 sec)

mysql> select * from bank;           <!--再次查询数据,发现已经便会了原来的值-->
+------+-------+
| name | money |
+------+-------+
| lu   |  1000 |
| qi   |  5000 |
+------+-------+
2 rows in set (0.00 sec)
mysql> commit;            <!--提交事务-->
Query OK, 0 rows affected (0.00 sec)

mysql> select * from bank;          <!--查询数据-->
+------+-------+
| name | money |
+------+-------+
| lu   |  1000 |
| qi   |  5000 |
+------+-------+
2 rows in set (0.00 sec)

一个事务所涉及到的命令如下:

  • 事务开始:start transaction或begin;
  • 事务提交:commit
  • 回滚:rollback
查看自动提交模式是自动还是手动
mysql> show variables like 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |          <!--“ON”表示自动提交-->
+---------------+-------+
1 row in set (0.01 sec)
mysql> set AUTOCOMMIT=0;         <!--关闭自动提交,0是关闭,1是开启-->
mysql> show variables like 'AUTOCOMMIT';            <!--再次查看-->
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

2、事务的四种隔离级别

一些关于MySQL事务的基础知识

事务在提交之前对其他事务可不可见。

  1. read unaommitted(未提交读)
  2. read committed(已提交读)
  3. Repeatable read(可重复读)
  4. seaializable(可串行化)
1)未提交读

事务中修改没有提交对其他事务也是可见的,俗称脏读。

<!--创建一个测试表-->
mysql> create table student
    -> (
    -> id int not null auto_increment,
    -> name varchar(32) not null default '',
    -> primary key(id)
    -> )engine=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

接下来需要自行开启两个MySQL会话终端,A和B,并且都执行以下命令设置为未提交读。

mysql> set session tx_isolation='read-uncommitted';

客户端A:

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from student;
Empty set (0.00 sec)

mysql> insert into student(name) values('zhangyi');
<!--注意,此时事务未提交!!!-->
mysql> set session tx_isolation='read-uncommitted';        <!--设置为未提交读-->
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select * from student;     <!--查询表,即可看到客户A没有提交的事务-->
+----+---------+
| id | name    |
+----+---------+
|  2 | zhangyi |
+----+---------+
1 row in set (0.00 sec)

总结:以上可以看出未提交读隔离级别非常危险,对于一个没有提交事务所做修改对另一个事务是可见状态,出现了脏读!非特殊情况不建议使用此级别。

2)已提交读

多数数据库系统默认为此级别(MySQL不是)。已提交读级别为一个事务只能已提交事务所做的修改,也就是解决了未提交读的问题。

客户端A插入数据测试:

mysql> set session tx_isolation='read-committed';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from student;
+----+---------+
| id | name    |
+----+---------+
|  2 | zhangyi |
+----+---------+
1 row in set (0.00 sec)
mysql> insert into student(name) values('zhanger');
Query OK, 1 row affected (0.00 sec)

mysql> select * from student;
+----+---------+
| id | name    |
+----+---------+
|  2 | zhangyi |
|  3 | zhanger |
+----+---------+
2 rows in set (0.00 sec)

客户端B查看(不会看到客户端A插入的数据):

mysql> select * from student;
+----+---------+
| id | name    |
+----+---------+
|  2 | zhangyi |
+----+---------+
1 row in set (0.00 sec)

客户端A进行提交:

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

客户端B进行查看(就可以看到A插入的数据了):

mysql> select * from student;
+----+---------+
| id | name    |
+----+---------+
|  2 | zhangyi |
|  3 | zhanger |
+----+---------+
2 rows in set (0.00 sec)

总结:从上面可以看出,提交读没有了未提交读的问题,但是我们可以看到客户端A的一个事务中执行了两次同样的SELECT语句,得到不同的结果,因此已提交读又被称为不可重复读。同样的筛选条件可能得到不同的结果。

3)可重复读

可重复读解决了不可重复读的问题,数据库级别没有解决幻读的问题。

以下是客户端A和客户端B同时操作(都设置为可重复读,然后两边都开启一个事务):

mysql> set session tx_isolation='repeatable-read';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

客户端A:

mysql> select * from student;
+----+---------+
| id | name    |
+----+---------+
|  2 | zhangyi |
|  3 | zhangsi |
+----+---------+
2 rows in set (0.00 sec)

mysql> update student set name='zhanger' where id=3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from student;           
+----+---------+
| id | name    |
+----+---------+
|  2 | zhangyi |
|  3 | zhanger |
+----+---------+
2 rows in set (0.00 sec)

客户端B:

mysql> select * from student;
+----+---------+
| id | name    |
+----+---------+
|  2 | zhangyi |
|  3 | zhangsi |
+----+---------+
2 rows in set (0.00 sec)

mysql> commit;         <!--提交当前事务-->
Query OK, 0 rows affected (0.00 sec)

mysql> select * from student;         <!--即可看到客户端A更新的数据-->
+----+---------+
| id | name    |
+----+---------+
|  2 | zhangyi |
|  3 | zhanger |
+----+---------+
2 rows in set (0.00 sec)

总结:上面可以看出,可重复读两次读取的内容不一样。数据库的幻读问题并没有得到解决。幻读只读定里面的数据,不能读锁定外的数据,解决幻读出了mvcc机制Mvcc机制。

4)可串行化

是最高隔离级别,强制事务串行执行,执行串行了也就解决问题了,这个只有在对数据一致性要求非常严格并且没有并发的情况下使用。

在客户端A及客户端B进行以下操作(设置为可串行读):

mysql> set session tx_isolation='serializable';

客户端A:

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from student where id < 10;
+----+---------+
| id | name    |
+----+---------+
|  2 | zhangyi |
|  3 | zhanger |
+----+---------+
2 rows in set (0.00 sec)

客户端B:

mysql> insert into student(name) values('zhangqi');
<!--此时进行插入操作时,会一直卡在这里,然后出现下面的报错信息,除非客户端Acommit提交事务-->
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
以上几种的隔离级别对比如下:
隔离级别脏读不可重复幻读加锁读
未提交读
提交读
可重复读
串行读

对于以上MySQL事务的基础知识相关内容,大家还有什么不明白的地方吗?或者想要了解更多相关,可以继续关注我们的数据库板块。

您可能感兴趣的文档:

--结束END--

本文标题: 一些关于MySQL事务的基础知识

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

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

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

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

下载Word文档
猜你喜欢
  • 一些关于MySQL事务的基础知识
    下面讲讲关于MySQL事务的基础知识,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完MySQL事务的基础知识这篇文章你一定会有所受益。 1、事务的基本语法<!--...
    99+
    2022-10-18
  • 一些有关MySQL基础知识介绍
    本文主要给大家介绍 一些有关MySQL基础知识,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下 一些有关MySQL基础知识吧。&n...
    99+
    2022-10-18
  • MySQL 主从的一些基础知识
    本篇文章给大家分享的是有关MySQL 主从的一些基础知识,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。MySQL复制原理1. 主库修改时会把数...
    99+
    2022-10-18
  • Javascript基础知识中关于内置对象的知识
    目录1、内置对象介绍1.1Math对象1.2Math中的方法1.3Date对象2、Date中的方法3、经典案例:倒计时效果:4、Array数组对象4.1数组的创建4.2数组中的常用方...
    99+
    2022-11-12
  • 关于JVM的基础知识有什么呢
    这期内容当中小编将会给大家带来有关关于JVM的基础知识有什么呢,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。虚拟机给人的感觉像是操作系统、编译器:非常高大上。但是Java程序就跑在上面,遇到问题还得去排查...
    99+
    2023-06-02
  • MySQL中的基础知识有哪些
    小编给大家分享一下MySQL中的基础知识有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!MySQL基础启动MySQL   net start mysql关闭MySQL &nb...
    99+
    2022-10-18
  • MySQL中的基础知识点有哪些
    这篇文章主要为大家展示了“MySQL中的基础知识点有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL中的基础知识点有哪些”这篇文章吧。一、SQL简述...
    99+
    2022-10-19
  • 基于Spring中的事务@Transactional知识点有哪些
    本篇内容介绍了“基于Spring中的事务@Transactional知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ACID,事务...
    99+
    2023-06-25
  • .Net Core微服务网关Ocelot基础知识有哪些
    本篇内容介绍了“.Net Core微服务网关Ocelot基础知识有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!网关是什么简单...
    99+
    2023-06-22
  • 关于umask(权限掩码)的一些知识
    关于umask(权限掩码)的一些知识 前言:首先,我们先介绍一下关于umask的一些基础知识,以方便更深入的了解umask 定义: umask(user-file-creation mode mask...
    99+
    2023-09-30
    linux 服务器 运维
  • Java代码审计的一些基础知识你知道吗
    目录JSP生命周期详细过程:War包结构JAVA 内置对象JAVA 中的危险函数名词概念总结JSP生命周期 关键词:Web服务器,JSP容器,JVM(Java虚拟机),servlet...
    99+
    2022-11-12
  • mysql数据库的一些基本知识
    下文主要给大家带来mysql数据库的一些基本知识,希望这些内容能够带给大家实际用处,这也是我编辑mysql数据库的一些基本知识这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。MySQL数据库&nbs...
    99+
    2022-10-18
  • 聊聊使用GitHub网站的一些基础知识
    GitHub是一个世界上最大的代码托管平台之一,它提供了一个方便的在线平台,让程序员可以共享自己的代码并与其他人协作开发。但是,对于那些没有使用过这个平台的人来说,了解如何使用GitHub有时可能会感到非常困难。因此,在本文中,我将向您展示...
    99+
    2023-10-22
  • MySQL的DDL、DML及DQL基础知识点有哪些
    这篇文章主要介绍“MySQL的DDL、DML及DQL基础知识点有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL的DDL、DML及DQL基础知识点有哪些...
    99+
    2022-10-19
  • 关于Android bitmap你不知道的一些事
    本文为大家分享了Android bitmap使用细节,供大家参考,具体内容如下 1、计算机表示图形的几种方式 1)BMP :几乎不进行压缩 占用空间比较大 2)JPG : 在...
    99+
    2022-06-06
    bitmap Android
  • 关于MySQL数据库的事务隔离和MVCC的详细知识
    下文给大家带来有关MySQL数据库的事务隔离和MVCC内容,相信大家一定看过类似的文章。我们给大家带来的有何不同呢?一起来看看正文部分吧,相信看完MySQL数据库的事务隔离和MVCC你一定会有所收获。1. ...
    99+
    2022-10-18
  • Java基础7:关于Java类和包的那些事
    更多内容请关注微信公众号【Java技术江湖】这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、EL...
    99+
    2023-06-02
  • 适用于PHP开发人员的Python基础知识有哪些
    今天就跟大家聊聊有关适用于PHP开发人员的Python基础知识有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。作为一种面向对象、直译式计算机程序设计语言,Python已经具有十多...
    99+
    2023-06-17
  • Nginx Web服务器的优点和基础知识有哪些
    Nginx Web服务器的优点和基础知识有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。当我们在不断使用Nginx Web服务器的时候...
    99+
    2022-10-19
  • 关于Nginx中虚拟主机的一些冷门知识小结
    目录前言对线上配置的一个小疑问问题背景实测结果探索排查网络排查nginx总结前言 nginx的虚拟主机,不知道大家了解不。以前吧,如果在nginx上要反向代理多个服务,我一般是让ng...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作