数据库-事务的讲解(针对Mysql数据库讲解)

目录

1.什么是事务?

2.事务是怎么做到同时成功和同时失败的呢?

3.重点来了!!!!事务的隔离性

一、读未提交read uncommitted  (最低序列级别)

二、读已提交 read committed(二档)

三、可重复读 repeatable read(三档)

     四、序列化serializable  (最高序列级别)(四档)

4.事务的四个特性


1.什么是事务?

既然是讲解事务,那我们首先要了解事务的概念

        事务:一个事务就是一个完整的业务逻辑

 什么是完整的业务逻辑?

        就是最小的工作单元,无法再分

记住!!!我们只有在使用DML语句的时候才会讨论到事务,也就是 insert、delete、update;

上面都是概念性的东西,我们来用大白话看:

        一个事务其实就是多条DML语句同时成功,或者同时失败

可能这个时候还是有朋友没看懂,我们来举一个简单的例子:

         我去银行给我的朋友小尧转账,我转钱,小尧收到钱了;我转钱,中途银行的系统突然出现     了故障,小尧就没收到钱了,而我这里钱的余额也跟我转钱之前一样。

        如果没有同时成功,同时失败这个条件呢?那么就是我转账,中途银行系统突然崩溃,小尧        没收到钱,我的余额却所剩无几了。

2.事务是怎么做到同时成功和同时失败的呢?

我们在这里先提及两个相关的术语

提交事务(commit):清空事务性活动的日志文件,将数据全部彻底持久化到数据库中;

回滚事务(rollback):将之前所有的DML操作全部撤销,并且将清空事务性活动的日志文件
               标志着事务的结束,并且是一种全部失败的结束;

这里的日志文件就是中途承接sql语句执行的一个文件(可以理解为临时存储)

           InnoDB存储引擎:提供一组用来记录事务性活动的日志文件
          在事务的执行过程中,每一条DML的操作都会记录到'事务性活动的日志文件'中
          在事务的执行过程中,我们可以提交事务,也可以回滚事务

无论在Mysql还是在JDBC中默认的都是自动提交事务机制

我们都需要手动写代码来保证手动提交事务机制

JDBC中主要需要这三个方法(我指的是在Java中用JDBC需要这么写):

Connection.setAutoCommit();
Connection.commit();
Connection.rollback();

Mysql中则是需要一行命令来打开(在mysqsl的命令行操作中需要这么写):

start transaction;

3.重点来了!!!!事务的隔离性

<1>什么是事务的隔离性?   

        我们来打个比方

                   A教室和B教室之间有一道墙,这道墙可以很厚也可以很薄,这就是事务的隔离级别
        墙越厚,表示隔离级别就越高

<2>事务和事务之间的隔离等级?

                读未提交、读已提交、可重复读、序列化

一、读未提交read uncommitted  (最低序列级别)

                事务A可以读取到事务B未提交的数据
                                                   这种隔离级别存在的问题就是:脏读现象!
                                                   我们称读到了脏数据
                                              这种隔离级别只存在于理论上,大多数数据库隔离级别都是二档起步

二、读已提交 read committed(二档)

                事务A只能读取到事务B已提交的数据
                                                           解决了脏读现象 
                                              这种隔离级别存在什么问题呢?      不可重复读取数据
                                              不可重复读取数据?
                                                                在事务开启之后,第一次读到数据是3条,当前事务还没有
                                                                结束,可能第二次再读取的时候,读到的数据是4条,3不等于                                                                  4
                                               oracle数据默认的隔离级别为读已提交
                                               读到的数据是真实的

三、可重复读 repeatable read(三档)

                什么是可重复读取?
                      事务A开启之后,不管是多久,每一次在事务A中读取到的数据
                      都是一致的,即使事务B已经修改,并且提交了,从事务A读取的数据
                      还是不变
                                                解决了什么问题?  解决了不可重复读数据
                                                 存在什么问题?
每次读取到的数据都是幻象,不够真实
                                                mysql中默认的隔离级别就是可重复读           

     四、序列化serializable  (最高序列级别)(四档)

                     这是最高隔离级别,解决了所有的问题。
                                              这种隔离级别表示事务排队,不能并发
                                              每次读取到的数据都是最真实的,但是效率是最低的

4.事务的四个特性

        事务包括四个特性?
         A.原子性    事务是最小工作单位,不可再分
         C.一致性     所有事务要求,在同一个事务当中,所有操作必须同时成功或者同时失败,保证数据                                的一致性
          I.隔离性     A事务和B事务之间具有一定的隔离
         D.持久性     事务最终结束的一个保障,事务提交,就相当于将没有保存到硬盘上的数据保存到                               硬盘上

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮卡丘学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值