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

MySQL 学习笔记之事务操作

文章目录

    • MySQL 事务操作
      • 事务概述
      • 1. 事务操作的基本用法
        • 1.1 创建表和插入数据
        • 1.2 设置手动提交
        • 1.3 正常的转账操作
        • 1.4 异常情况处理
        • 1.5 使用 `START TRANSACTION`
      • 2. 事务隔离级别
        • 2.1 查看当前事务隔离级别
        • 2.2 设置事务隔离级别
      • 完整代码

MySQL 事务操作


事务概述

事务是数据库管理系统中的一个重要概念,它用于保证数据库操作的完整性和一致性。事务可以确保一组操作要么全部成功,要么全部失败,避免了部分成功部分失败的情况,从而保持数据的一致性。


事务的四个特性(ACID)

  1. 原子性 (Atomicity):事务中的所有操作要么全部成功,要么全部失败,不会出现部分成功的情况。
  2. 一致性 (Consistency):事务的执行会将数据库从一个一致性状态转变为另一个一致性状态。
  3. 隔离性 (Isolation):一个事务的操作不会受到其他事务的干扰,每个事务都在独立的环境中运行。
  4. 持久性 (Durability):一旦事务被提交,其对数据库的更改是持久的,即使系统崩溃也不会丢失。




1. 事务操作的基本用法

1.1 创建表和插入数据
CREATE TABLE account
(id    INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',name  VARCHAR(10) COMMENT '姓名',money DOUBLE(10, 2) COMMENT '余额'
) COMMENT '账户表';INSERT INTO account(name, money)
VALUES ('张三', 2000),('李四', 2000);

说明

  • AUTO_INCREMENT:自动生成唯一的ID。
  • DOUBLE(10, 2):定义金额的字段,最多10位数字,其中2位为小数部分。



1.2 设置手动提交
SET @@autocommit = 1; -- 设置手动提交

说明

  • @@autocommit:用于控制事务是否自动提交。设置为1表示启用自动提交,设置为0表示手动提交事务。



1.3 正常的转账操作
-- 查询张三余额
SELECT * FROM account WHERE name = '张三';-- 张三的余额减少1000
UPDATE account SET money = money - 1000 WHERE name = '张三';-- 李四的余额增加1000
UPDATE account SET money = money + 1000 WHERE name = '李四';-- 提交事务
COMMIT;

说明

  • 在进行数据修改(如转账操作)时,通常需要先查询确认操作的前提条件,然后执行修改操作,最后提交事务以保存修改。



1.4 异常情况处理
-- 查询张三余额
SELECT * FROM account WHERE name = '张三';-- 张三的余额减少1000
UPDATE account SET money = money - 1000 WHERE name = '张三';-- 出错了...
-- 李四的余额增加1000
UPDATE account SET money = money + 1000 WHERE name = '李四';-- 回滚事务
ROLLBACK;

说明

  • 如果在事务执行过程中发生错误,可以使用 ROLLBACK 回滚事务,撤销所有未提交的修改,恢复到事务开始之前的状态。



1.5 使用 START TRANSACTION
-- 启动事务
START TRANSACTION;-- 查询张三余额
SELECT * FROM account WHERE name = '张三';-- 张三的余额减少1000
UPDATE account SET money = money - 1000 WHERE name = '张三';-- 出错了...
-- 李四的余额增加1000
UPDATE account SET money = money + 1000 WHERE name = '李四';-- 提交事务
COMMIT;-- 回滚事务
ROLLBACK;

说明

  • START TRANSACTION 用于显式地开始一个事务。在事务执行完毕后,使用 COMMIT 提交事务,或者在出现异常时使用 ROLLBACK 回滚事务。




2. 事务隔离级别

事务隔离级别定义了事务在并发环境下的行为。不同的隔离级别会影响事务的可见性和数据库的一致性。MySQL 提供了四种隔离级别:

  1. READ UNCOMMITTED:允许读取未提交的数据,可能会出现脏读。
  2. READ COMMITTED:只允许读取已提交的数据,防止脏读,但可能会出现不可重复读。
  3. REPEATABLE READ:在事务开始时,读取的结果在事务期间始终如一,防止脏读和不可重复读,但可能出现幻读。
  4. SERIALIZABLE:最严格的隔离级别,通过强制事务串行执行,避免脏读、不可重复读和幻读,但性能可能较低。
2.1 查看当前事务隔离级别
-- 查看当前事务隔离级别
SELECT @@transaction_isolation;

说明

  • 通过 @@transaction_isolation 可以查看当前数据库的事务隔离级别。



2.2 设置事务隔离级别
-- 设置事务隔离级别为 READ UNCOMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;-- 设置事务隔离级别为 REPEATABLE READ
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

说明

  • SET SESSION TRANSACTION ISOLATION LEVEL 用于设置当前会话的事务隔离级别。
  • 不同的隔离级别会影响事务的并发行为和数据一致性,根据实际需求选择合适的隔离级别。




完整代码

-- ---------------------------------------- 事务操作 -------------------------------------
create table account
(id    int primary key AUTO_INCREMENT comment ' ID',name  varchar(10) comment ' 姓名 ',money double(10, 2) comment ' 余额 '
) comment ' 账户表 ';
insert into account(name, money)
VALUES (' 张三 ', 2000),(' 李四 ', 2000);-- 恢复数据
update account set money = 2000 where name = ' 张三 ' or name = ' 李四 ';select @@autocommit;set @@autocommit = 1; -- 设置手动提交-- 转账操作
-- 正常情况
-- 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 = ' 李四 ' ;-- 异常情况
-- 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 = ' 李四 ' ;-- 提交事务
commit;-- 回滚事务(出现异常就操作)
rollback;-- 方式二
-- 转账操作
start transaction;-- 异常情况
-- 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 = ' 李四 ' ;-- 提交事务
commit;-- 回滚事务
rollback;-- 事务隔离级别
-- 查看事务隔离级别
select @@transaction_isolation;-- 设置事务隔离级别
set session transaction isolation level read uncommitted;set session transaction isolation level repeatable read;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • yd云手机登录算法分析
  • EXCEL 分段排序--Excel难题#86
  • 趣味算法------尾部零的个数(C语言,python双重解法)
  • 【微信小程序】使用 npm 包 - API Promise化-- miniprogram-api-promise
  • 出现Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are requiredProperty报错
  • C语言函数介绍(上)
  • [Qt][QSS][下]详细讲解
  • Makefile简单使用
  • [论文笔记]Improving Retrieval Augmented Language Model with Self-Reasoning
  • 基于神经塑性的地球观测多模态基础模型 (慕尼黑工业大学, TUM)
  • zookeeper集群安装
  • 标配M4芯片!苹果三款Mac新品蓄势待发
  • lucene搜索关键词错误
  • 企业级web应用服务器tomcat
  • 学习前端面试知识(15)
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • Cumulo 的 ClojureScript 模块已经成型
  • Docker入门(二) - Dockerfile
  • JavaScript 奇技淫巧
  • Joomla 2.x, 3.x useful code cheatsheet
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • MQ框架的比较
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 半理解系列--Promise的进化史
  • 基于游标的分页接口实现
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 力扣(LeetCode)357
  • 十年未变!安全,谁之责?(下)
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • puppet连载22:define用法
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ​字​节​一​面​
  • #DBA杂记1
  • #控制台大学课堂点名问题_课堂随机点名
  • ${factoryList }后面有空格不影响
  • (1)SpringCloud 整合Python
  • (C语言)fgets与fputs函数详解
  • (web自动化测试+python)1
  • (不用互三)AI绘画工具应该如何选择
  • (二十四)Flask之flask-session组件
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .Net 6.0--通用帮助类--FileHelper
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Framework杂记
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化