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

深入浅出MySQL事务处理:从基础概念到ACID特性及并发控制

1、什么是事务

在实际的业务开发中,有些业务操作要多次访问数据库。一个业务要发送多条SQL语句给数据库执行。需要将多次访问数据库的操作视为一个整体来执行,要么所有的SQL语句全部执行成功。如果其中有一条SQL语句失败,就进行事务的回滚,所有的SQL语句全部执行失败。

简而言之,事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败。

事务作用:保证在一个事务中多次操作数据库表中数据时,要么全都成功,要么全都失败。

2、手动提交事务

MYSQL中可以有两种方式进行事务的操作:

1. 手动提交事务:先开启,再提交

2. 自动提交事务(默认的):即执行一条sql语句提交一次事务。事务有关的SQL语句:

手动提交事务使用步骤

第1种情况:开启事务 -> 执行SQL语句 -> 成功 -> 提交事务

第2种情况:开启事务 -> 执行SQL语句 -> 失败 -> 回滚事务

自动提交事务

MySQL的每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,执行完毕自动提交事务,MySQL默认开始自动提交事务。自动提交,通过修改mysql全局变量“autocommit”进行控制。

1.通过以下命令可以查看当前autocommit模式:

show variables like '%commit%';

2.设置自动提交的参数为OFF:

set autocommit = 0;  -- 0:OFF  1:ON

小结

1)MySql默认自动提交。即执行一条sql语句提交一次事务。

2)设置autocommit为off状态,只是临时性的,下次重新连接mysql,autocommit依然变为on状态。

3)如果设置autocommit为off状态,那么当我们执行一条sql语句,就不会自动提交事务,重新启动可视化工具,数据并没有改变。

4)如果设置autocommit为on状态,如果我们先执行 start transaction; 然后在执行修改数据库的语句:

update account set money = money-100 where name='a';

update account set money = money+100 where name='b';

那么此时就表示上述修改数据库的sql语句都在同一个事务中,此时必须手动提交事务,即commit;

换句话说,如果我们手动开启事务 start transaction; 那么此时mysql就不会自动提交事务,必须手动提交事务。

5)如果设置autocommit为on状态,如果我们不执行 start transaction; 直接执行修改数据库的语句:

update account set money = money-100 where name='a';

update account set money = money+100 where name='b';

那么此时mysql就会自动提交事务。即上述每条sql语句就是一个事务。

-- 自动提交事务:每条sql语句就是一个事务,那么执行一条sql语句就会提交一次事务
-- mysql数据库就是自动提交事务
-- a给b转账100元
update account set money=money-100 where name='a';
update account set money=money+100 where name='b';-- 查看mysql是否自动提交事务
-- autocommit的值是on表示自动提交事务,值是off表示关闭自动提交事务
show variables like '%commit%';
-- 我们可以使用命令临时设置mysql变为手动提交事务,即将自动提交事务关闭
-- 下次重新连接mysql依然是自动提交事务
set autocommit = 0; -- 0 表示关闭自动提交事务 1表示开启自动事务
update account set money=money-100 where name='a'

事务的四大特性(ACID)(面试)

数据库的事务必须具备ACID特性,ACID是指 Atomicity(原子性)、Consistensy(一致性)、Isolation(隔离性)和Durability(持久性)的英文缩写

1、隔离性(Isolation)

多个用户并发的访问数据库时,一个用户的事务不能被其他用户的事务干扰,多个并发的事务之间要相互隔离。

一个事务的成功或者失败对于其他的事务是没有影响。2个事务应该相互独立

2、持久性(Durability)

指一个事务一旦被提交,它对数据库的改变将是永久性的,哪怕数据库发生异常,重启之后数据亦然存在

3、原子性(Atomicity)

原子性是指事务**包装的一组sql(一组业务逻辑)是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

4、一致性(Consistency)

一个事务在执行之前和执行之后 数据库都必须处于一致性状态。

如果事务成功的完成,那么数据库的所有变化将生效。

如果事务执行出现错误,那么数据库的所有变化将会被回滚(撤销),返回到原始状态。

**事务的成功与失败,最终数据库的数据都是符合实际生活的业务逻辑。一致性绝大多数依赖业务逻辑和原子性

事务的并发访问引发的三个问题(面试)

事务在操作时的理想状态:多个事务之间互不影响,如果隔离级别设置不当就可能引发并发访问问题。

能够理解并发访问的三个问题赃读:一个事务读取另一个事务还没有提交的数据,一定避免。不可重复读:一个事务读取多次数据内容不一样,主要是update语句。事务已经提交了。 可以发生的。幻读:一个事务读取多次数量不一样,主要是delete或者insert语句。事务已经提交了。可以发生的。

事务的隔离级别

2、安全和性能对比

安全性:serializable > repeatable read > read committed > read uncommitted

性能 : serializable < repeatable read < read committed < read uncommitted

3、注意:其实三个问题,开发中最严重的问题就是脏读,这个问题一定要避免,而关于不可重复读和虚读其实只是感官上的错误,并不是逻辑上的错误。就是数据的时效性,所以这种问题并不属于很严重的错误。如果对于数据的时效性要求不是很高的情况下,我们是可以接受不可重复读和虚读的情况发生的。

相关文章:

  • Ubuntu24.04.1系统下VideoMamba环境配置
  • Certbot自动申请并续期https证书
  • Linux基础(二):磁盘分区
  • Rust调用tree-sitter支持自定义语言解析
  • 等保2.0数据库测评之达梦数据库测评
  • 启动hadoop集群出现there is no HDFS_NAMENODE_USER defined.Aborting operation
  • go 使用笔记
  • Java面试题·解释题·Vue框架
  • 学Java还是c++好?
  • Python:import语句的使用(详细解析)(一)
  • C语言 | Leetcode C语言题解之第448题找到所有数组中消失的数字
  • excel不经过后台实现解析和预览(vue)
  • Docker Compose 搭建 nacos 集群
  • react-问卷星项目(3)
  • 多普勒频移
  • ES6指北【2】—— 箭头函数
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • C++入门教程(10):for 语句
  • CODING 缺陷管理功能正式开始公测
  • gops —— Go 程序诊断分析工具
  • Intervention/image 图片处理扩展包的安装和使用
  • Javascript 原型链
  • Just for fun——迅速写完快速排序
  • Meteor的表单提交:Form
  • SAP云平台里Global Account和Sub Account的关系
  • scrapy学习之路4(itemloder的使用)
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 解析 Webpack中import、require、按需加载的执行过程
  • 实战|智能家居行业移动应用性能分析
  • 算法之不定期更新(一)(2018-04-12)
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 走向全栈之MongoDB的使用
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​2021半年盘点,不想你错过的重磅新书
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​香农与信息论三大定律
  • #{}和${}的区别?
  • #stm32驱动外设模块总结w5500模块
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (175)FPGA门控时钟技术
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (70min)字节暑假实习二面(已挂)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二开)Flink 修改源码拓展 SQL 语法
  • (二十三)Flask之高频面试点
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (六)Flink 窗口计算
  • (南京观海微电子)——示波器使用介绍
  • (三)终结任务
  • (转载)Linux网络编程入门
  • (状压dp)uva 10817 Headmaster's Headache