mysql手动事务

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: mysql手动事务


简要

mysq事务是自动提交的, 例如insert, update语句等

如下:

想要手动设置mysql事务就需要使用如下语句:

-- 关闭自动提交
set autocommit = 0;

autocommit默认值为1, 也就是默认开启自动事务

手动事务使用案例

创建表格

create database if not exists db_transacton;
user db_transaction;
 
-- 创建用户表
create table userinfo(
    id int primary key,
    name varchar(20),
    money double
);

插入数据:

insert into userinfo values(1,'zhangsan',1000);
insert into userinfo values(2,'lisi',1000);

设置手动提交事务:

set autocommit = 0;

在设置手动事务之前可以先查看autocommit的状态:

select @@autocommit;

-- 结果如下:

结果为1相当于开启了自动提交.

模拟账户转账:

begin; -- 首先要开启事务
update userinfo set money = money - 200 where id = 1; -- id == 1代表zhangsan
update userinfo set money = money + 200 where id = 2; -- id == 2代表lisi 
 
-- 以下两个操作只能选择一个, 要么提交, 要么回滚
-- 执行完毕之后, 提交事务
commit;
 
-- 回滚事务
rollback

提交事务之后. 那么就相当于zhangsan向lisi转账成功, 回滚操作就相当于 提交的事务出现了问题,被重置, zhangshan和lisi都回到了交易之前的状态.

事务的特性

  • 原子性: 也就是事务开启之后, 之后的所有操作要么完成要么不完成, 就例如转账的时候, 涉及到一个人的账户减少, 另外一个人的账户增加, 那么这两个操作, 要么全部完成, 要么全部失败, 全部失败也就是执行了回滚操作, 让一个行为执行, 另外一个行为无法执行的情况重置到最开始的情况, 也就是两个行为都没发生的情况. 要么就两个行为都成功, 然后提交事务
  • 一致性:这里的一致性可以理解为事务操作之后数据的正确性, 就例如一个人向另外一个人转账, 不可能是转账的那个人转出去500, 收账的人到账600吧? 这不符合数据库的正确性, 所以事务操作应该保证在执行事务的前后, 系统数据的正确性
  • 隔离性: 这个事物在操作的过程中, 有可能收到其他事务的干扰, 例如有一个人向收账人转账, 收账人又对其账户进行取款, 那么转账这个行为就是取款这个操作看不见的. 我有1000大洋, 我向别人转账的时候, 分两步, 一步是我的扣200, 另外一步是别人的账户加200, 提交事务后那我的账户就是800,但是这个时候如果另外一个给我转账的事务也在进行, 给我转了500块, 但是给我转账的事务是先提交的, 这个时候我的账户就是1500, 然后再提交我给别人转账的事务, 那么就将我的账户余额修改为了800, 那么我不亏大发了. 所以应该设置隔离, 让这两个事务尽量互不干扰.
  • 持久性: 事务一旦提交, 其结果就是数据库被修改, 数据就会在本地数据库进行存储或者修改, 本地磁盘的操作是永久的. 除非下次继续修改此磁盘.

事务的隔离级别

       Isolate, 顾名思义就是将事务与另外一个事物隔离开, 为什么要隔离开呢? 如果一个事物正在操作的数据也被另外一个事务修改了, 最后执行结果可能无法达到预期, 如果没有隔离这两个事务, 那么后面还会导致很多问题出现.

       这张图,  越往下面, 也就是越靠近序列化, 那么他的隔离级别就越高, 反之就越低, mysql的隔离级别默认是可重复度,

       下面我们探究一个这四个事务隔离级别的作用:

  • 读未提交( Read uncommitted )

       一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证,会造成脏读问题.

  • 读已提交(Read committed)

       一个事务要等另一个事务提交后才能读取数据,可避免脏读的发生,会造成不可重复读

  • 可重复读(Repeatable read)

           就是在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读的发生但是会造成幻读
  • 串行(Serializable)
           是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用

下面来分析一下什么叫做脏读, 不可重复读, 幻读!!  

脏读

       脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的,值得注意的是,脏读一般是针对于update操作的.

       一个事务正在访问数据, 并且对数据做出了修改, 但是这种修改并没有提交到数据库中去, 也就是虽然修改了数据库的值, 但是并未提交事务, 没有提交事务就代表这个事物随时可能因为出现问题而回滚, 此外另外一个事务也访问这个数据, 然后使用了这个数据, 但是这个数据并未随着事务提交,而事后这个事务因为某些原因写入了错误的值而回滚, 这个时候另外一个事物读取到了这个错误的数据, 也就是脏数据, 依据这个脏数据做出的行为是不正确的. 他很有可能破坏事物的一致性. 那么这个事务读取这个错误的数据的行为就叫做脏读.

不可重复读

       不可重复读,是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。

       在一个事务内, 多次访问同一个数据, 但是同时另外一个事物也在访问同一数据并且要修改这个数据, 而且这个修改操作是穿插在这个事务多次访问之间的, 由于别的事务的修改, 那么会让第一个事务多次读取可能会存在读到的数据不一样的情况, 这样就发生了一个事务多次读取同一个数据, 但是读取到的结果是不一样的情况, 因此称为不可重复读.

幻读

       指当事务不是独立执行时发生的一种现象.

       例如, 事务T1对一个表中的数据进行了修改, 这个修改操作设计表中的全部数据行, 同时第二个事务T2也修改这个表中的数据, 这种修改时向表中插入一行新数据, 那么以后就会发生: 操作事务T1的用户发现表中还存在没有修改的数据行, 就好像发生了幻觉一样.

       解决 幻读, 一般的方法是增加范围锁rangeS, 锁定检索范围为只读, 这样就避免了幻读.

查看事务隔离级别

show variables like '%isolation%'

其中Variable_name = transaction_isolation 的value值为 Repeatable-read, 也就是可重复读.

设置隔离级别

-- 设置读未提交
set session transaction isolation level read uncommitted;
 
-- 设置读已提交
set session transaction isolation level read committed;
 
-- 设置可重复读
set session transaction isolation level repeatable read;
 
-- 设置串行化
set session transaction isolation level serializable;


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
19天前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
|
26天前
|
SQL 关系型数据库 MySQL
MySQL基础:事务
本文详细介绍了数据库事务的概念及操作,包括事务的定义、开启、提交与回滚。事务作为一组不可分割的操作集合,确保了数据的一致性和完整性。文章还探讨了事务的四大特性(原子性、一致性、隔离性、持久性),并分析了并发事务可能引发的问题及其解决方案,如脏读、不可重复读和幻读。最后,详细讲解了不同事务隔离级别的特点和应用场景。
85 4
MySQL基础:事务
|
3天前
|
SQL Oracle 关系型数据库
详解 MySQL 的事务以及隔离级别
详解 MySQL 的事务以及隔离级别
9 0
|
2月前
|
SQL 关系型数据库 MySQL
Mysql原理与调优-事务与MVCC
【8月更文挑战第19天】
|
2月前
|
存储 SQL 关系型数据库
深入解析MySQL事务机制和锁机制
深入解析MySQL事务机制和锁机制
|
2月前
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。
|
2月前
|
SQL 关系型数据库 MySQL
MySQL 事务回滚。在执行删除、更新等操作时,防止误操作
MySQL 事务回滚。在执行删除、更新等操作时,防止误操作
88 2
|
2月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
67 0
|
2月前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
64 0
|
2月前
|
存储 关系型数据库 MySQL
MySQL 中的事务存储引擎深入解析
【8月更文挑战第31天】
28 0
下一篇
无影云桌面