首页 > 数据库 >MYSQL-->事务

MYSQL-->事务

时间:2022-08-30 19:11:08浏览次数:59  
标签:事务 -- account 查询 提交 MYSQL id 客户端

定义

  • 事务是一组操作的集合,它是一个不可分割的工作单位。
  • 事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,这些操作要么同时成功,要么同时失败

流程

开启事务---->提交事务

如果中间出现了异常,就回滚事务

回滚事务指的是将修改的数据恢复

注意:MYSQL中默认事务自动提交,即执行DML语句的时候MYSQL会立即隐式的提交事务.

事务的操作演示

以转账为例

假定有这样一个账单

账户 余额
张三 2000
李四 2000

现进行以下操作

  1. 查询张三的余额

    select * from account where name='张三';
    
  2. 对张三的余额-1000

    update account set money=money-1000 where name='张三';
    
  3. 对李四的余额+1000

    update account set money=money+1000 where name='李四';
    

对这三条指令在同一时间执行那么表会变成

账户 余额
张三 1000
李四 3000

假定2--3中存在SQL语句A,且A中SQL语句必然不能执行成功

这张表就会变成

账户 余额
张三 1000
李四 2000

那么将1,2,A,3的代码在同一时间执行,就会出现1,2执行成功A,3执行不超过

这时候我们回滚事务回复即可。

在MYSQL中每一条DML语句都是一个单独的事务,并且默认自动提交。

事务的执行语法

查看事务提交方式

Select @@autocommit;

如果是1代表手动提交,0代码自动提交。在MYSQL中@@代表系统变量,@代表用户自定义变量。

设置事务的提交方式

Set @@autocommit=0或者1;(这个是将整个控制台提交方式的修改)

或者

begin;  开启事务
Start transcation; 开启事务

提交事务

commit;

回滚事务

rollback;

一般事务用法:

begin或start transcation
SQL语句
commit;

出现错误
回滚事务
roolback;

事务的四大特性(ACID)

原子型(Atomicity)

事务是不可分割的最小操作单位,要么全部成功要么全部失败

一致性(Consistency)

事务完成时,必须使所有数据保持一致的状态

隔离性(Isolation)

数据库提供的隔离机制,保证事务不受外部并发操作的影响的独立环境运行

持久性(Durability)

事务一旦提交或回滚,他对数据库中的数据影响是永久的

并发事务产生的问题

A事务和B事务同时操作同一张表引发的问题叫并发事务问题

就多个操作端,同时操作一张表产生的问题。

脏读

事务A读取到了事务B未提交的数据

过程

  1. 事务A查询表内容
  2. 事务B更新表内容(并未提交!)
  3. A事务再次查询表内容时读取到了事务B并未提交的内容。

代码过程

事务A的客户端(数字代表执行顺序)

1. begin;  ->客户端A开启事务
3. select * from account where id=1;   ->事务A查询id=1的内容
5. select * from account where id=1;   ->事务A再次查询id=1的内容
6.读取到了客户端B未提交的数据

事务B的客户端

2. begin;  ->客户端B开启事务
4. update account set mone=money-1000 where id=1;  ->事务B更新id=1的数据

A事务读取到了B事务未提交的数据就叫脏读

不可重复读

在一个事务中,查询俩次前后查询数据不一致的叫不可重复读

过程

  1. A事务第一次查询id=1的记录
  2. B事务更新id=1的记录并且提交
  3. A事务第二次查询id=1的记录,结果前后不一致

代码过程

事务A的客户端(数字代表执行顺序)

1. begin;		->客户端A开启事务
3. select * from account where id=1;  ->客户端A第一次查询id=1的记录
6. select * from account where id=1;  ->客户端A第二次查询id=1的记录
7. 前后查询不一致!

事务B的客户端

2. begin;		->客户端B开启事务
4. update account set money=money+1000 where id=1; ->客户端B更新id=1的记录
5. commit;  ->客户端B提交数据

幻读

事务A按条件查询一个记录的时候该记录不存在

但是按照这个条件插入数据的时候会返回已经存在该数据。这种叫幻读

过程

  1. 事务A先查询数据a发现该数据不存在
  2. 事务B插入数据a并且提交
  3. 事务A插入数据a的时候返回说已经存在数据a
  4. 事务A查询时依然显示不存在数据a

代码过程

客户端A(数字代表执行顺序)

1. begin;   ->客户端A开启事务
3. select * from account where id=3; ->假定不存在id=3的数据,事务A第一次查询id=3的数据
6. insert into account(id,name,money) values(3,'王五',3000); ->事务A插入id=3的数据,结果反馈说已经存在id=3的数据
7. select * from account where id=3; ->事务A继续查询id=3的数据,反馈不存在id=3的数据

客户端B

2. begin;  ->客户端B开启事务
4. insert into account(id,name,money) values(3,'王五',3000); ->事务B插入id=3的数据
5. commit;  ->事务B提交数据

并发事务的隔离级别

  • √代表会出现

  • ×代表不会出现

隔离级别 脏读 不可重复读 幻读
Read uncommitted
Read committed ×
Repeatable Read(默认) × ×
Serializable × × ×

从read uncommitted--->serializable 隔离级别依次提高,性能依次下降。

语法

查询当前事务的隔离级别

select @@transaction_isolation;  

设置事务的隔离级别

set [session/global] transaction isolation level [级别];

session代表对当前窗口有效,global代表对全部窗口有效

标签:事务,--,account,查询,提交,MYSQL,id,客户端
From: https://www.cnblogs.com/wdadwa/p/MYSQL_Learning_05.html

相关文章

  • 实现web实时消息推送的7种方案
    实现web实时消息推送的7种方案敲代码的程序汪 ​关注 209人赞同了该文章我有一个朋友~做了一个小破站,现在要实现一个站内信web消息推送的功能,对......
  • leetcode-998. 最大二叉树 II
    998.最大二叉树II图床:blogimg/刷题记录/leetcode/998/刷题代码汇总:https://www.cnblogs.com/geaming/p/16428234.html题目思路看到树就要想到递归。解法/***D......
  • 《伯恩斯焦虑自助疗法》读书笔记3
      对于轻微焦虑的人,基于幽默的治疗法也是一种不错的治疗方法,值得尝试!基于幽默的治疗法有害羞暴露练习法,悖论放大法,幽默想象法!  每个人都有自己的使命!每个人都有自......
  • c++ 复习
    取消编译优化选项-fno-elide-constructors:优化返回值。函数返回对象的时候,可以省略函数内return的那次复制,以及调用函数“=”的那次复制。-std=c++0x。参考:【C+......
  • Arrays.asList() 报UnsupportedOperationException异常
    Arrays中的asList方法将数组转为List<>之后,用remove和add方法会报UnsupportedOperationException异常1、asList是通过新建一个ArrayList来接收String[]的数值。  2......
  • 深圳华锐视点:企业VR全景虚拟展示厅提升客户线上参观体验
    以往我们出去旅游通过大众点评的评价,从图片和文字中去辨别这个旅游景点是否和简介一样,然后才会选择买票出发。但不乏也有一些是商店请的拖或是网红推荐来赚取佣金的,内......
  • 大道如青天,协程来通信,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang通道channel的使
    众所周知,Golang的作用域相对严格,数据之间的通信往往要依靠参数的传递,但如果想在多个协程任务中间做数据通信,就需要通道(channel)的参与,我们可以把数据封装成一个对象,然后把......
  • 移动测试
    移动测试操作系统     需要考虑APP在主流平台上的页面展示和样式的加载,目前考虑的主流平台主要是Android和IOS的平台 分辨率        不管是什么平台,都......
  • 数字信号处理--第二章/离散时间信号和离散时间系统
    离散时间信号--数字序列离散时间信号的表示概述对于x(n):n为整数时有对应数值,n非整数时,x(n)没有定义,不可认定为0单位取样序列δ(n):n=0时值为1;单位冲激函数δ(t):n=0时值为∞......
  • Linux的NFS的配置
    快速代码#nfs的Server配置文件和配置方法echo'/newnfs192.168.3.*rw,sync,no_root_squash)'>>/etc/exports#根目录新建文件夹,权限777mkdir/newnfs&&chmod77......