首页 > 数据库 >MySQL中的事务

MySQL中的事务

时间:2023-01-16 17:13:58浏览次数:39  
标签:事务 money 张三 李四 提交 MySQL 1000

事务简介

事务:是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
就比如: 张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加1000。 这一组操作就必须在一个事务的范围内,要么都成功,要么都失败。
image
正常情况: 转账这个操作, 需要分为以下这么三步来完成 , 三步完成之后, 张三减少1000, 而李四增加1000, 转账成功 :
image
异常情况: 转账这个操作, 也是分为以下这么三步来完成 , 在执行第三步是报错了, 这样就导致张三减少1000块钱, 而李四的金额没变, 这样就造成了数据的不一致, 就出现问题了。
image
为了解决上述的问题,就需要通过数据的事务来完成,我们只需要在业务逻辑执行之前开启事务,执行完毕后提交事务。如果执行过程中报错,则回滚事务,把数据恢复到事务开始之前的状态。
image
注意: 默认MySQL的事务是自动提交的,也就是说,当执行完一条DML语句时,MySQL会立即隐式的提交事务。

事务操作

数据准备:

drop table if exists account;

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 = '李四';
-- 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,1表示自动提交,0表示手动提交
select @@autocommit;
set @@autocommit=0;
  • 提交事务
commit;
  • 回滚事务
rollback;

注意:上述的这种方式,我们是修改了事务的自动提交行为, 把默认的自动提交修改为了手动提交, 此时我们执行的DML语句都不会提交, 需要手动的执行commit进行提交。

控制事务方式二

  • 开启事务
start transaction;
-- 或
begin; 
  • 提交事务
commit;
  • 回滚事务
rollback;

事务四大特性(ACID)

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立 环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
    上述就是事务的四大特性,简称ACID。

并发事务问题

赃读

一个事务读到另外一个事务还没有提交的数据。
image
比如B读取到了A未提交的数据。

不可重复读

一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
image
事务A两次读取同一条记录,但是读取到的数据却是不一样的。

幻读

一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 "幻影"。
image

事务隔离级别

为了解决并发事务所引发的问题,在数据库中引入了事务隔离级别。主要有以下几种:

隔离级别 脏读 不可重复读 幻读
读未提交(Read uncommitted)
读已提交(Read committed) ×
重复读(Repeatable Read)(默认) × ×
序列化(Serializable) × × ×

查看事务隔离级别

select @@TRANSACTION_ISOLATION;

设置事务隔离级别

set session |global TRANSACTION ISOLATION LEVEL  READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE

注意:事务隔离级别越高,数据越安全,但是性能越低。

标签:事务,money,张三,李四,提交,MySQL,1000
From: https://www.cnblogs.com/yellow-mokey/p/17055628.html

相关文章

  • mysql主从同步失败 错误码1594
    起因某日mysql主从同步发生了错误,此时发现从库不再执行同步操作,于是在从库执行showslavestatus\G发现如下错误:上图中标红色的需要重点关注。解决办法之前出现其他常......
  • SQL Server查找未提交事务
    USEmasterGOSETTRANSACTIONISOLATIONLEVELREADUNCOMMITTEDSELECTes.session_id,es.login_name,es.host_name,est.text,cn.last_read,cn.last_write,es.pr......
  • mysql8.0.30主从配置
    安装包下载地址:https://downloads.mysql.com/archives/community/1、解压介质包:#tarxfmysql-8.0.30-linux-glibc2.12-x86_64.tar.xz#mvmysql-8.0.30-linux-glib......
  • MySQL自定义排序ORDER BY FIELD
    在一些场景中,有场景A查询出一个已经排好顺序的id,需要到场景B中查询这些,使用mysql中的WHERE**IN(****),查询出来的结果并不是按照传入的list排序的.但是......
  • MySQL必知必会第十章-创建计算字段
    创建计算字段计算字段计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句内创建的。字段(field)基本上与列(column)的意思相同,经常互换使用,不过数据库列一......
  • MySQL优化四,高性能优化
    一,查询优化器这个部分的整个过程是由MySQL的存储引擎来做的,优化器就会根据存储引擎来使用原来的开销,优化后的开销,哪个更好一点? 1.如果是查询语句(select语句),首先会查......
  • MySQL必知必会第九章-用正则表达式进行搜索
    用正则表达式进行搜索正则表达式介绍正则表达式是用来匹配文本的特殊的串(字符集合)。使用MySQL正则表达式MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则......
  • MySQL的多表查询
    多表关系项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三......
  • Mysql备份数据库结构和数据的脚本
    echo取日期、时间变量值setyy=%date:~0,4%setmm=%date:~5,2%setdd=%date:~8,2%if/i%time:~0,2%lss10sethh=0%time:~1,1%if/i%time:~0,2%geq10set......
  • MySQL中的any_value()函数
    在工作中第第一次接触到any_value()函数,自己去了解这个函数的作用。简单来说,在MySQL5.7之后,如果有使用groupby对字段A、B……分组,那么select后面的查询项必须包含group......