当前位置: 首页 > news >正文

Mysql-------事务

事务

一、事务

(一)什么是事务:

MySQL数据库事务:(database transaction): 事务是由一组SQL语句组成的逻辑处理单元,这些操作要么全做要么全不做,是一个不可分割的工作单位。

※ MySQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型不支持!

数据库默认事务是自动提交的,也就是发一条 sql 它就执行一条。如果想多条 sql 放在一个事务中执行,则需要使用事务进行处理。当我们开启一个事务,并且没有提交,MySQL 会自动回滚事务,或者我们使用 rollback 命令手动回滚事务。

(二)为什么使用事物:

通过将一组操作组成一个操作单元,执行时,要么全部成功,要么全部失败的单元。

例如:A账户汇款给B账户1000元。

A账户-1000

B账户+1000

以上操作对应数据库为两个update。这两个操作属于一个事物。否则,可能会出现A账户钱少了,B账户钱没增加的情况;或者因为A账户的余额不足(少于1000)不能扣除1000,而B账户却增加1000。

(三)事务四大特性:

事务是必须满足4个条件(ACID)

原子性(Autmic):事务必须是原子工作单元,不能被分隔的,事务中的操作要么全部执行,要么全都不执行,不能只完成部分操作。

一致性(Consistency):事务开始之前,数据库处于一致性的状态;事务结束后,数据库必须仍处于一致性状态。数据库一致性的定义是由用户负责的。例如,在银行转账中,用户可以定义转账前后两个账户金额之和保持不变。

  隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰,这些通过锁来实现。

  持久性(Durability):指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

事务的 ACID 原则保证了一个事务或者成功提交,或者失败回滚,二者必居其一。因此,它对事务的修改具有可恢复性。即当事务失败时,它对数据的修改都会恢复到该事务执行前的状态。

(四)MySQL事务处理的方法:

用BEGIN或START TRANSACTION,ROLLBACK,COMMIT来实现事务

START TRANSACTION | BEGIN  

#开启事务

COMMIT 

#提交当前事务,执行永久操作。

ROLLBACK 

#回滚当前事务到开始点,取消上一次开始点后的所有操作。

MySQL默认是自动提交的,也就是你提交一个SQL QUERY,它就直接执行!

SET AUTOCOMMIT = {0 | 1} 设置事务是否自动提交,默认是自动提交的。

0:禁止自动提交

1:开启自动提交。

注意:MySQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持!

MySQL> set autocommit=0;

MySQL> delimiter //

MySQL> start transaction;

    -> update books set bName="ccc" where bId=1;

    -> update books set bName="ddd" where bId=2;

    -> commit; //

MySQL> delimiter ;

测试,查看是否完成修改:

MySQL> select bName from books where bId=1 or bId=2;

我们测试回滚操作,首先看我们的数据库存储引擎是否为innodb

MySQL> show create table books;

为MyISAM无法成功启动事务,虽然提交了,却无法回滚

修改数据库存储引擎为innodb

MySQL> alter table books engine=innodb;

MySQL> alter table category engine=innodb;

MySQL> show create table books;

MySQL> select bName from books where bId=1 or bId=2;

重新开启事务,并测试回滚

MySQL> delimiter //

MySQL> start transaction;

    -> update books set bName="HA" where bId=1;

    -> update books set bName="LB" where bId=2;

    -> commit //

MySQL> delimiter ;

MySQL> select bName from books where bId=1 or bId=2;

MySQL> rollback;  #回滚

Query OK, 0 rows affected (0.00 sec)

查看结果:  

MySQL> select bName from books where bId=1 or bId=2;

回滚失败,因为我们commit已经提交了,并且执行成功了

这次开启事务,不提交

MySQL> delimiter //

MySQL> start transaction; 

MySQL> update books set bName="AH" where bId=1; 

MySQL> update books set bName="BL" where bId=2 

MySQL> //   #开启事务,不提交

MySQL> delimiter ;

MySQL> select bName from books where bId=1 or bId=2;

回滚:

MySQL> rollback;

MySQL> select bName from books where bId=1 or bId=2;

回滚成功

可以看到,执行rollback回滚命令后,rollback使数据表回滚到了事物开始前的状态。很多时候一个事物会包含多条语句,而出现问题需要回滚时,并不一定是要回滚到begin之前的状态,有可能是某条语句执行后的状态,这时要使用savepoint定义回滚点,rollback决定回滚到的位置。

例如:以test_db数据库的stu表为例,表结构如下所示:

关闭MySQL的自动提交功能:

MySQL> set autocommit=0;

MySQL> begin;

MySQL> insert into stu values(1,'berry');

MySQL> savepoint s1;

MySQL> insert into stu values(2,'linda');

MySQL> savepoint s2;

执行第一条插入语句后,定义了回滚点s1,执行第二条插入语句后,定义了回滚点s2,如果后面直接使用rollback命令,这两条插入语句都将失效,现在使用回滚点进行回滚。

执行回滚前,查询stu表中数据:

执行rollback回滚到s1回滚点

回滚到了s1,第一条插入的数据可以查询出来,但是并没有提交,如果需要保存到数据库,使用commit命令提交。

相关文章:

  • PWM(脉宽调制)技术详解:从基础到应用实践示例
  • 动态规划之背包问题
  • 正式页面开发-登录注册页面
  • 阿里云k8s服务部署操作一指禅
  • ECharts极简入门
  • 基于STM32设计的自动追光系统(系统资料)
  • 基于Chatbox AI部署Deepseek等模型
  • 环境变量1
  • 在项目中调用本地Deepseek(接入本地Deepseek)
  • 基于ffmpeg+openGL ES实现的视频编辑工具-字幕添加(六)
  • Django项目之订单管理part1
  • VS Code 如何搭建C/C++开发环境
  • Aseprite绘画流程案例(1)——画相机图标
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_test_full_name
  • 如何使用Spark SQL进行复杂的数据查询和分析
  • 一些耳朵起茧子的名词解释
  • 快速查询区间overlap的C/C++库:cgranges
  • C++ Primer 类的作用域
  • vue3项目的创建与配置
  • tailscale + derp中继 + 阿里云服务器 (无域名版)
  • 市场监管总局召开平台企业支持个体工商户发展座谈会
  • 加强战略矿产出口全链条管控将重点开展哪些工作?商务部答问
  • 杭州钱塘区3宗涉宅用地均以底价成交,共计成交金额25.73亿元
  • 三亚通报救护车省外拉警报器开道旅游:违规违法,责令公司停业整顿
  • 检疫期缩减至30天!香港优化内地进口猫狗检疫安排
  • 联合国秘书长欢迎中美经贸高层会谈成果