Mysql的事务

MySQL


事务

事务用于保证数据的一致性,它由一组相关的dml(数据操作语言 增删改)语句组成

该组的dml语句要么全部成功,要么全部失败。

-- 1. 创建一张测试表
CREATE TABLE t27( id INT,`name` VARCHAR(32));-- 2. 开始事务
START TRANSACTION -- 3. 设置保存点
SAVEPOINT a-- 执行dml 操作
INSERT INTO t27 VALUES(100, 'tom');
SELECT * FROM t27;SAVEPOINT b
-- 执行dml操作
INSERT INTO t27 VALUES(200, 'jack');-- 回退到 b
ROLLBACK TO b-- 继续回退 a
ROLLBACK TO a-- 如果这样, 表示直接回退到事务开始的状态.
ROLLBACK COMMIT

事务和锁

当执行事务操作时(dml语句),mysql会在表上加锁, 防止其它用户改表的数据

事务的几个重要操作

  1. start transaction --开始一个事务
  2. savepoint 保存点名–设置保存点
  3. rollback to 保存点名–回退事务
  4. rollback --回退全部事务
  5. commit – 提交事务,所有的操作生效,不能回退

回退事务

保存点(savepoint)是事务中的点,用于取消部分事务

当结束事务时(commit),会自动的删除该事务所定义的所有保存点

当执行回退事务时,通过指定保存点可以回退到指定的点


提交事务

使用commit语句可以提交事务,当执行了commit语句子后

会确认事务的变化、结束事务、删除保存点、释放锁,数据生效。

当使用commit语句结束事务后,其它会话[其他连接]将可以查着到事务变化后的新数据[所有数据就正式生效]


注意

  1. 如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
  2. 如果开始一个事务,你没有创建保存点,你可以执行rollback,默认就是回退到你事务开始的状态
  3. 你可以在事务没有提交前,选择回退到哪个保存点
  4. mysql的事务机制需要innodb的存储引擎才可以使用,myisam不好使
  5. 开始一个事务start transaction或者可以写 set autocommit=off
-- 1. 如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
INSERT INTO t27 VALUES(300, 'milan'); -- 自动提交 commitSELECT * FROM t27-- 2. 如果开始一个事务,没有创建保存点. 你可以执行 rollback,
-- 默认就是回退到你事务开始的状态
START TRANSACTION 
INSERT INTO t27 VALUES(400, 'king');
INSERT INTO t27 VALUES(500, 'scott');
ROLLBACK -- 表示直接回退到事务开始的的状态
COMMIT;-- InnoDB 存储引擎支持事务 , MyISAM 不支持




事务隔离

多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作

以保证各个连接在获取数据时的准确性。(通俗解释:每一个事务看到同一张表的数据不一样)

如果不考虑隔离性,可能会引发如下问题:

  • 脏读(dirty read):当一个事务读取另一个事务尚未提交的改变(update,insert,delete)时,产生脏读。(未commit)
  • 不可重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读。(已commit)
  • 幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。(已commit)

事务隔离级别

概念: Mysql隔离级别定义了事务与事务之间的隔离程度。

加锁会在其他线程操作数据库时,不操作数据库,自己卡住,等待其他线程commit后才进入数据库。

-- 1. 开了两个mysql的控制台
-- 2. 查看当前mysql的隔离级别
SELECT @@tx_isolation;-- mysql> SELECT @@tx_isolation;
-- +-----------------+
-- | @@tx_isolation  |
-- +-----------------+
-- | REPEATABLE-READ |
-- +-----------------+-- 3.把其中一个控制台的隔离级别设置 Read uncommittedSET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED-- 4. 创建表
CREATE TABLE `account`(id INT,`name` VARCHAR(32),money INT);-- 查看当前会话隔离级别 
SELECT @@tx_isolation
-- 查看系统当前隔离级别
SELECT @@global.tx_isolation
-- 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
-- 设置系统当前隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL [你设置的级别]

设置事务隔离级别

  1. 查看当前会话隔离级别

    select @@tx_isolation;
    
  2. 查看系统当前隔离级别

    select @@global.tx_isolation;
    
  3. 设置当前会话隔离级别

    set session transaction isolation level repeatable read;
    
  4. 设置系统当前隔离级别

    set global transaction isolation level repeatable read;
    
  5. mysql默认的事务隔离级别是 repeatable read,一般情况下,没有特殊
    要求,没有必要修改(因为该级别可以满足绝大部分项目需求)

如果想要修改默认隔离级别,可以全局修改,修改my.ini配置文件,在最后加上

#可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ,SERIALIZABLE.
[mysqld]
transaction-isolation = REPEATABLE-READ

事务特性

  • 原子性(Atomicity)
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

  • 一致性(Consistency)
    事务必须使数据库从一个二致性状态变换到另外一个一致性状态

  • 隔离性(lsolation)
    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离

  • 持久性(Durability)
    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响





存储引擎


MySQL的表类型由存储引擎(Storage Engines)决定,主要包括MylSAMinnoDBMemory

MySQL 数据表主要支持六种类型,分别是: BDBHEAPISAMMERGEMYISAMInnoBDB

这六种又分为两类一类是”事务安全型”(transaction-safe) 支持事务,比如: InnoDB,其余都属于第二类,称为”非事务安全型”(non-transaction-safe) 不支持事务 [mysiammemory].

注意:

  1. MylSAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求
  2. InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MylSAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
  3. MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦MySQL服务关闭,表中的数据就会丢失掉, 表的结构还在。

存储引擎使用

-- 查看所有的存储引擎
SHOW ENGINES
-- innodb 存储引擎,是前面使用过.
-- 1. 支持事务 2. 支持外键 3. 支持行级锁-- myisam 存储引擎
CREATE TABLE t28 (id INT,`name` VARCHAR(32)) ENGINE MYISAM
-- 1. 添加速度快 2. 不支持外键和事务 3. 支持表级锁START TRANSACTION;
SAVEPOINT t1
INSERT INTO t28 VALUES(1, 'jack');
SELECT * FROM t28;
ROLLBACK TO t1-- memory 存储引擎
-- 1. 数据存储在内存中[关闭了Mysql服务,数据丢失, 但是表结构还在] 
-- 2. 执行速度很快(没有IO读写) 3. 默认支持索引(hash表)CREATE TABLE t29 (id INT,`name` VARCHAR(32)) ENGINE MEMORY
DESC t29 -- 表结构还在
INSERT INTO t29VALUES(1,'tom'), (2,'jack'), (3, 'hsp');
SELECT * FROM t29-- 指令修改存储引擎
ALTER TABLE `t29` ENGINE = INNODB

修改存储引擎

ALTER TABLE `表名` ENGINE = 储存引擎;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/47895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

泰宁风景旅游区-泰宁旅游景点大全排名

泰宁旅游必去十大景点 泰宁景区是国家5A级景区,而且作为全国重点文物保护单位,该景区的游玩项目很多,比如说七大景区,当然了,原始生态为主要景观特点,集奇异性、多样性、休闲性、文化性为一身。那么如果到这…

数据结构,二叉树,前中后序遍历

二叉树的种类 最优二叉树 最优二叉树画法 排序取最小两个值和,得到新值加入排序重复1,2 前序、中序和后序遍历是树形数据结构(如二叉树)中常用的遍历方式,用于按照特定顺序遍历树的节点。这些遍历方式在不同应用中有不…

无涯教程-Perl - wantarray函数

描述 如果当前正在执行的函数的context正在寻找列表值,则此函数返回true。在标量context中返回false。 语法 以下是此函数的简单语法- wantarray返回值 如果没有context,则此函数返回undef;如果lvalue需要标量,则该函数返回0。 例 以下是显示其基本用法的示例…

Self-Alignment with Instruction Backtranslation

本文是LLM系列文章,针对《Self-Alignment with Instruction Backtranslation》的翻译。 指令反翻译的自动对齐 摘要1 引言2 方法3 实验4 不足5 相关工作6 结论 摘要 我们提出了一种可扩展的方法,通过用相应的指令自动标记人类书写的文本来建立高质量的…

当图像宽高为奇数时,如何计算 I420 格式的uv分量大小

背景 I420 中 yuv 数据存放在3个 planes 中。 网上一般说 I420 数据大小为 widthheight1.5 但是当 width 和 height 是奇数时,这个计算公式会有问题。 I420 中 u 和 v 的宽高分别为 y 的一半。 但是当不能整除时,是如何取整呢?向上还是向下&…

高忆管理:沪指震荡跌0.24%,医药、酿酒等板块走低,数据要素概念逆市活跃

22日早盘,两市股指高开低走,沪指盘中冲高回落,创业板指走势疲弱;北向资金净卖出超40亿元。 到午间收盘,沪指跌0.24%报3085.48点,深成指跌0.73%,创业板指跌1.3%;两市合计成交4510亿元…

【李宏毅机器学习】注意力机制

输出 我们会遇到不同的任务,针对输出的不一样,我们对任务进行划分 给多少输出多少 给一堆向量,输出一个label,比如说情感分析 还有一种任务是由机器决定的要输出多少个label,seq2seq的任务就是这种,翻译也…

js数组操作的shift unshift pop push用法

Array.shift() shift() 方法用在数组上, 移除数组的第一个元素并返回移除的元素. 该方法会改变原数组的长度. const array1 [1, 2, 3];const firstElement array1.shift();console.log(array1); // Expected output: Array [2, 3]console.log(firstElement); …

Java List的扩容机制原理及应用

Java List的扩容机制原理及应用 引言 在Java中,List是一种非常常用的数据结构,用于存储有序的元素集合。List的底层实现有多种,如ArrayList、LinkedList等。在使用List时,我们经常会遇到一个问题:当元素数量超过了Li…

docker 03(docker 容器的数据卷)

一、数据卷的概念和作用 删除后,数据也没了。 不能 数据卷 是宿主机中的一个目录或文件当容器目录和数据卷目录绑定后,对方的修改会立即同步一个数据卷可以被多个容器同时挂载 作用: 容器数据持久化 外部机器和容器间接通信 容器之间数据交换…

无人机空管电台-中大型无人机远程VHF语音电台系统

方案背景 中大型无人机在执行飞行任务时,特别是在管制空域飞行时地面航管人员需要通过语音与无人机通信。按《无人驾驶航空器飞行管理暂行条例》规定,中大型无人机应当进行适航管理。物流无人机和载人eVTOL都将进行适航管理,所以无人机也要有…

robotframework如何做接口测试?

robotframework(后续简称为robot)是一款自动化测试框架,可能做各种类型的自动化测试。 本文介绍通过robotframework来做接口测试。 在robot当中,python语言的接口测试库名称为RequestsLibrary 安装语法如下: pip install -U requests pip …

Window下部署使用Stable Diffusion AI开源项目绘图

Window下部署使用Stable Diffusion AI开源项目绘图 前言前提条件相关介绍Stable Diffusion AI绘图下载项目环境要求环境下载运行项目打开网址,即可体验文字生成图像(txt2img)庐山瀑布 参考 本文里面的风景图,均由Stable Diffusion…

Sui生态项目|集隐私通信、移动钱包、链上朋友圈和红包功能一体的社交应用ComingChat

ComingChat是在Sui网络上构建的去中心化社交平台,功能众多,其中加密聊天功能为用户提供了安全的沟通方式。该功能利用了Signal加密协议,这是一种在Signal、WhatsApp和Skype等应用中广受欢迎的开源软件协议。 ComingChat在Sui上提供了全面的…

c++——重写(覆盖),实际上对应的就是虚函数

重写是指派生类中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。只有函数体不同(花括号内),派生类调用时会调用派生类的重写函数,不会调用被重写函数…

LeetCode //C - 57. Insert Interval

57. Insert Interval You are given an array of non-overlapping intervals intervals where intervals[i] [ s t a r t i , e n d i start_i, end_i starti​,endi​] represent the start and the end of the i t h i^{th} ith interval and intervals is sorted in asce…

qt显示图片并转换成灰度图及伪彩图

写了个程序,可在途图片,并切换成灰度图及伪彩图显示,主要代码如下: #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainW…

如何使用营销活动,提升小程序用户的参与度

在当今数字化时代,小程序已成为企业私域营销的重要一环。然而,仅仅拥有小程序还不足以吸引用户的兴趣和参与。营销活动作为推动用户参与的有效手段,可以在激烈的市场竞争中脱颖而出。本文将深入探讨如何使用营销活动,提升小程序用…

【leetcode 力扣刷题】链表基础知识 基础操作

链表基础知识 基础操作 链表基础操作链表基础知识插入节点删除节点查找节点 707. 设计链表实现:单向链表:实现:双向链表 链表基础操作 链表基础知识 在数据结构的学习过程中,我们知道线性表【一种数据组织、在内存中存储的形式】…

ssh框架原理及流程

1.hibernate工作原理: 读取并解析配置文件读取并解析映射信息,创建sessionFactory打开session创建事务transaction持久化操作提交事务关闭session关闭sessionFactory 为什么使用: 对JDBC访问数据库的代码做了封装,大大简化了数据…