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

MySQL数据库进阶-事务

事务

事务由单独单元的一个或多个SQL语句组成,在这 个单元中,每个MySQL语句是相互依赖的。而整个单独单 元作为一个不可分割的整体,如果单元中某条SQL语句一 旦执行失败或产生错误,整个单元将会回滚。所有受到影 响的数据将返回到事物开始以前的状态;如果单元中的所 有SQL语句均执行成功,则事物被顺利执行。

1、概念:在mysql中的数据用各种不同的技术存储 在文件(或内存)中。

2、通过show engines;来查看mysql支持的存储引 擎。

3、 在mysql中用的最多的存储引擎有:innodb, myisam ,memory 等。其中innodb支持事务,而 myisam、memory等不支持事务

基本操作:

-- 1. 查询张三账户余额
select * from account where name = '张三';
-- 2. 将张三账户余额-1000
update account set money = money - 1000 where name = '张三';
-- 此语句出错后张三钱减少但是李四钱没有增加
模拟sql语句错误
-- 3. 将李四账户余额+1000
update account set money = money + 1000 where name = '李四';

-- 查看事务提交方式
SELECT @@AUTOCOMMIT;
-- 设置事务提交方式,1为自动提交,0为手动提交,该设置只对当前会话有效
SET @@AUTOCOMMIT = 0;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;

-- 设置手动提交后上面代码改为:
select * from account where name = '张三';
update account set money = money - 1000 where name = '张三';
update account set money = money + 1000 where name = '李四';
commit;

操作方式二:

开启事务: START TRANSACTION 或 BEGIN TRANSACTION; 提交事务: COMMIT; 回滚事务: ROLLBACK;

操作实例:

start transaction;
select * from account where name = '张三';
update account set money = money - 1000 where name = '张三';
update account set money = money + 1000 where name = '李四';
commit;

四大特性ACID

  • 原子性(Atomicity):事务是不可分割的最小操作但愿,要么全部成功,要么全部失败

  • 一致性(Consistency):事务完成时,必须使所有数据都保持一致状态

  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行

  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

并发事务

问题描述
脏读一个事务读到另一个事务还没提交的数据
不可重复读一个事务先后读取同一条记录,但两次读取的数据不同
幻读一个事务按照条件查询数据时,没有对应的数据行,但是再插入数据时,又发现这行数据已经存在

对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没 有采取必要的隔离机制, 就会导致各种并发问题:

脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.

不可重复读: 对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.

幻读: 对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插 入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.

数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.

一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就 越好, 但并发性越弱.

事务隔离级别

隔离级别脏读不可重复读幻读
Read uncommitted
Read committed×
Repeatable Read(默认)××
Serializable×××
  • √表示在当前隔离级别下该问题会出现

  • Serializable 性能最低;Read uncommitted 性能最高,数据安全性最差

Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE。

Oracle 默认的事务隔离级别为: READ COMMITED

Mysql 支持 4 种事务隔离级别.

Mysql 默认的事务隔离级别 为: REPEATABLE READ 在 MySql 中设置隔离级别

每启动一个 mysql 程序, 就会获得一个单独的数据库连接. 每 个数据库连接都有一个全局变量 @@tx_isolation, 表示当前的 事务隔离级别.

查看当前的隔离级别:

SELECT @@tx_isolation; 

设置当前 mySQL 连接的隔离级别:

set transaction isolation level read committed;

设置数据库系统的全局的隔离级别:

set global transaction isolation level read committed;

相关文章:

  • 论文阅读记录SuMa SuMa++
  • rust中Atomic Ordering含义总结
  • Docker 镜像以及镜像分层
  • AI绘画Midjourney绘画提示词Prompt大全
  • Nougat:科学文档的OCR 使用记录
  • 12月笔记
  • 软件测试|Linux下Python安装配置指南
  • Parallels虚拟机启动后,Mac主机无法上网怎么办
  • 软件测试|深入解析Docker Run命令:创建和启动容器的完全指南
  • 力扣(leetcode)第482题密钥格式化(Python)
  • 71内网安全-域横向网络传输应用层隧道技术
  • 【LLM】大型语言模型:2023年完整指南
  • 【STM32】STM32学习笔记-ADC单通道 ADC多通道(22)
  • 网络安全(黑客)—2024自学
  • 渗透第四天 (抽空再看一天 )
  • 游戏进度恢复--备忘录模式
  • 实验笔记之——服务器链接
  • 【STM32】STM32学习笔记-DMA数据转运+AD多通道(24)
  • uni-appcss语法
  • 浅析观察者模式在Java中的应用
  • 河南一女子被医院强制带走治疗,官方通报:当值医生停职
  • 101岁陕西省军区原司令员冀廷璧逝世,曾参加百团大战
  • 上海一保租房社区亮相,首批546套房源可拎包入住
  • 师爷、文士、畸人:会稽范啸风及其著述
  • 青海省交通运输厅副厅长田明有接受审查调查
  • 腾讯一季度营收增长13%,马化腾:战略性的AI投入将带来长期回报