mysql学习笔记之事务

author author     2022-12-04     220

关键词:

MYSQL学习笔记之事务_事务

(一)什么是事务??

事务其实就是一个完整的业务逻辑,不可再分,是一个最小的工作单元。

准确来说,一个事务就是批量的DML语句同时成功或者同时失败。

说明:只有DML语句与事务有关系,其他语句与事务无关

DML语句: insert、delete、update语句(对数据库表中的数据进行操作)

(二)存在原因

   在处理某中业务的时候,需要多条DML语句共同联合起来才能完成

(三)如何保持?

  InnoDB存储引擎:提供一组用来记录事务性活动的日志文件。

 在事务执行的过程中,每一条DML的操作都会记录到“事务性活动的日志文件”中。

 在事务执行的过程中,即可以提交事务,也可以回滚事务。

提交事务??(commit; 语句 )

  清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中

  提交事务标志着事物的结束,并且是一种全部成功的结束。

回滚事务??(rollback;语句---->上一次提交<commit>的位置 )

    将之前的DML操作全部撤销,并且清空事务性活动的日志文件,回滚事务标志着

事务的结束,并且是一种全部失败的结束。

mysql默认情况下是支持自动提交的(执行一次sql语句,就执行一次)

缺点:一个完整的业务是需要经过多条DML语句共同执行才可能完成,为了保证数据的安全,必须要求同时成功之后再提交,

所以要关闭这种默认自动提交机制。

如何关闭呢??

命令:start transaction;

#------------------------------回滚事务-----------------------------------

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

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

mysql> insert into flower(name)values(玫瑰);
Query OK, 1 row affected (0.00 sec)

mysql> insert into flower(name)values(月季);
Query OK, 1 row affected (0.00 sec)

mysql> select * from flower;
+------+
| name |
+------+
| 玫瑰 |
| 月季 |
+------+
2 rows in set (0.00 sec)

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

mysql> select * from flower;
Empty set (0.00 sec)
#-----------------------提交事务----------------------------

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

mysql> insert into flower(name)values(玫瑰);
Query OK, 1 row affected (0.00 sec)

mysql> insert into flower(name)values(月季);
Query OK, 1 row affected (0.00 sec)

mysql> insert into flower(name)values(牡丹);
Query OK, 1 row affected (0.00 sec)

mysql> select * from flower;
+------+
| name |
+------+
| 玫瑰 |
| 月季 |
| 牡丹 |
+------+
3 rows in set (0.00 sec)

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

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

mysql> select * from flower;
+------+
| name |
+------+
| 玫瑰 |
| 月季 |
| 牡丹 |
+------+
3 rows in set (0.00 sec)

(四)事务特性

I.原子性: 指的是事务的最小工作单元,不可再分。

II.一致性:所有事务要求,在同一个事务中,所有的操作必须同时成功,或者同时失败,以保证数据的一致性。

III.隔离性:是针对数据资源的并发访问,规定了各个事务之间相互影响的程度。

IV.持久性: 事务最终结束的一个屏障。事务提交,就相当于没有保存到硬盘上的数据保存到硬盘上。

补充:

事物之间的隔离性

A、B教室中间有一道墙,根据墙的厚薄,可以分为不同的级别

事务与事务之间也存在一定的级别,具体分类如下:

(1)读未提交: read uncommitted(最低的隔离级别)

             基本介绍:事务A可以读取到事务B未提交的数据。

            存在问题:脏读现象(dirty read)

(2)读已提交: read committed<oracle默认的隔离级别>

           基本介绍:事务A只能读取到事务B提交之后的数据。

          存在问题:不可重复读取数据(由于事务B并未完全提交导致事务A读取的时候只能读取到提交的数据)

          特点:读到的数据比较真实

(3)可重复读:repeatable read<读取不到提交之后的数据,永远读取的都是开启事务时的数据>

          基本介绍:事务A开启之后,每一次在事务A中读取到的数据都是一致的(即使事务B的数据已经修改,事务A读取到的数据还是不会改变)

   存在问题: 幻影读(每次读取的数据都是幻影,不够绝对的真实)


(4) 序列化/串行化: serializable(最高的隔离级别)

           隔离级别最高,效率最低,解决了所有的问题,表示事务排队,不能并发。

(五)实践验证

查看默认隔离级别:

mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ |
+-------------------------+
1 row in set (0.00 sec)

验证: read uncommitted

mysql>set gloabl transaction isolation level read uncommitted;

                     事务A                                                 事务B  

----------------------------------------------------------------------------                use bjpowernode;                                                                                                                                                           use bjpowernode;

             start transaction;

             select * from t_user;

                                                                             start transaction;

                                                               insert into t_user values(zhangsan)

             select * from t_user;      

结果:事务B插入后,可以在事务A中查到,在事务B<rollback>后就在事务A中查不到了

--------------------------------------------------------------------------------------

验证:read committed

mysql>set gloabl transaction isolation level read committed;

                     事务A                                                 事务B

----------------------------------------------------------------------------

        use bjpowernode;

                                                                               use bjpowernode;

        start transaction;

                                                                               start transaction;

       select * from t_user;

                                                              insert into t_user values(zhangsan);

       select * from t_user;                                     

                                                                              commit;

       select  * from t_user;

-------------------------------------------------------------------------------------

验证:repetable read

mysql>set gloabl transaction isolation level  repeatable read;

                     事务A                                                 事务B

----------------------------------------------------------------------------

       use bjpowernode;

                                                                               use bjpowernode;

        start transaction;

                                                                               start transaction;

       select * from t_user;

                                                              insert into t_user values(zhangsan);

                                                                insert into t_user values(lisi);

       select * from t_user;

结果:事务A查到的结果一直没变,与丝毫不受事务B的任何影响。

----------------------------------------------------------------------------

 验证:serializable  

mysql>set gloabl transaction isolation level  serializable;

                     事务A                                                 事务B

---------------------------------------------------------------------------

       use bjpowernode;

                                                                               use bjpowernode;

        start transaction;

                                                                               start transaction;

       select * from t_user;

       insert into t_user values(fei);                         

                                                                              select * from t_useer;(一致等待,除非事务A提交) 

结果:事务A和事务B不能同时操作同一个表,会有一个先后顺序。

优秀博文:

https://baijiahao.baidu.com/s?id=1709428402761709469&wfr=spider&for=pc



mysql高级学习笔记(代码片段)

文章目录MySQL基础篇学习笔记SQL性能下降的原因SQL的执行顺序索引索引的优劣势索引的分类索引的创建索引结构判断是否需要创建索引EXPLAINEXPLAIN之idEXPLAIN之select_typeEXPLAIN之tableEXPLAIN之typeEXPLAIN之possible_keysEXPLAIN之keyEXPLAIN之key_lenEX... 查看详情

springmvc学习笔记-springmvc整合mybatis之service

springmvc学习笔记(8)-springmvc整合mybatis之servicespringmvc学习笔记8-springmvc整合mybatis之service定义service接口在spring容器配置service事务控制本文记录如何整合service,包括定义spring接口,在spring容器配置service以及事务控制。让spring管理servic... 查看详情

《第七周学习笔记》

教材学习总结1.下载安装MySQL数据库管理系统。2.MySQL数据库的基本运用。3.下载JDBC-MySQL数据库驱动.加载JDBC-MySQL数据库驱动4.事务:步骤一用setAutoCommit(booleanb)方法关闭自动提交模式、步骤二用commit()方法处理事务、步骤三用... 查看详情

mysql学习笔记-事务(代码片段)

事务事务:是一组操作的集合,是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败(当操作中某一步出现异常时,前面已执行的步骤也会失效)... 查看详情

第十四周学习笔记

 关于MYSQL事务的过程 1,在数据库使用事务时,必须先开启事务为了方便举例说明,先在MYSQL里面建立数据库表格插入数据 查询首先开启一个事务,通过UPDATE语句将A账户的100元转给B账户STARTTRANSACTION 为开启事务COMM... 查看详情

《高性能mysql》读书笔记之mysql锁事务多版本并发控制的基础知识

1.2并发控制   1.2.1 读写锁     在处理并发读或写时,通过实现一个由两种类型的锁组成的锁系统来解决问题。这两种类型的锁通常被称为共享锁(sharedlock)和排它锁(exclusivelock),也叫读锁(readlock)和写锁(writelock... 查看详情

mysql学习笔记之索引

(一)什么是索引??    索引(Index)是在数据库的字段上添加的,是为了提高查询的效率存在的一种机制。一张表的一个字段可以添加一个索引,当然,多个字段联合起来也可以添加索引。索引相当于是一本书... 查看详情

mysql学习笔记之连接查询

(一)连接查询?    从一张表中单独查询,称为单表查询。   emp表和dept表联合起来进行查询数据,从emp表中取员工名字,从dept表中取部门名字,这种跨表查询,多张表联合起来进行查询数据的方式称... 查看详情

mysql学习笔记(代码片段)

MySQL学习笔记文章目录MySQL学习笔记登录和退出MySQL服务器基本语法建表约束主键约束唯一主键非空约束默认约束外键约束数据库的三大设计范式1NF2NF3NF查询练习准备数据1到10分组计算平均成绩分组条件与模糊查询多表查询-1多表... 查看详情

mysql学习笔记(代码片段)

目录一、什么是数据库?二、RDBMS术语三、数据类型四、SQL1、数据定义语言(DDL)2、数据操纵语言(DML)3、数据查询语言(DQL)4、数据控制语言(TCL)1、什么是事务2、事务操作五、函数1、GROUPBY(聚合)函数2、控制流程函数3... 查看详情

学习笔记事务与分布式事务

一、事务本地事务是在单个数据源上进行数据的访问和更新,分布式系统下由不同服务之间通过网络远程协作完成的事务被称为分布式事务。分布式事务的应用场景:微服务架构之间,即多服务器访问多数据库实例单... 查看详情

学习笔记之mariadb的入门操作(代码片段)

由于CentOS7将mysql全部都改成了mariadb。所以在CentOS下yum安装mysql是没有用的。虽然还是有一大堆软件包叫做mysql。mysql-community-release.noarchel7-5installedphp-mysql.x86_645.4.16-23.el7_0.3@RHELakonadi-mysql.x86_641.9.2-4.el7RHELdovec 查看详情

python学习笔记之使用pycharm连接mysql数据库(代码片段)

代码:#coding:utf-8'''mysqlsearchjoin'''importmysql.connectorconfig='host':'localhost','port':3306,'user':'root','password&# 查看详情

深入学习mysql事务:acid特性的实现原理

https://juejin.im/post/5c9cb91d5188251cea0abbd7事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段。MySQL博大精深,文章疏漏之处在所难免,欢迎批评指正。一,基础概念事务(Transaction)是访问和更新数据库... 查看详情

golang学习笔记(代码片段)

mysql支持插件式的存储引擎。myisam和innodb。myisam查询速度快,只支持表锁,不支持事务。innodb整体速度快,支持表锁和行锁,支持事务。事务的特点:acid:原子性,一致性(事务开始和结束之间的... 查看详情

mysq学习笔记之十null值处理

   这是MySQL一大特殊之处。   概念上。NULL意味着“没有值”或“未知值”,且它被看作有点与众不同的值。为了測试NULL。你不能使用算术比較运算符比如=、<或!=。为了说明它,试试下列查询... 查看详情

javaweb学习内容之3万字核心javascript笔记

更多Java全套学习资源均在专栏,持续更新中↑↑戳进去领取~🍗MySQL的安装及登陆基本操作(附图)手把手带你安装🍗MySQL基础:通过SQL对数据库进行CRUD🍗MySQL基础:通过SQL对表、数据进行CRUD,... 查看详情

学习笔记事务与分布式事务

一、事务本地事务是在单个数据源上进行数据的访问和更新,分布式系统下由不同服务之间通过网络远程协作完成的事务被称为分布式事务。分布式事务的应用场景:微服务架构之间,即多服务器访问多数据库实例单... 查看详情