mysql sql 事务写作_一文精通MySQL事务规则

我们一起学习进步!

正文

4d0a3bbb7e5c459d5160aed920824ead.png

引言:

每个程序员学习数据库离不开MySQL,而学习MySQL就必学事务,今天我们就来一起学习一下MySQL的事务;

事务的概念

在实际的业务开发中,有些业务操作要多次访问数据库。一个业务要发送多条SQL语句给数据库执行。由多条SQL语句组成一个功能(事务).需要将多次访问数据库的操作视为一个整体来执行,要么所有的SQL语句全部执行成功。如果其中有一条SQL语句失败,就进行事务的回滚,所有的SQL语句全部执行失败。

事务应用场景

最通俗易懂的就是银行转账的案例,例如张三给李四转钱,张三账号减去相应数额资金,李四账号添加相应数额资金;

案例演示:

-- 创建account数据表

CREATE TABLE account (

id INT PRIMARY KEY AUTO_INCREMENT,

NAME VARCHAR(10),

balance DOUBLE

);

-- 添加数据

INSERT INTO account (NAME, balance) VALUES ('张三', 1000), ('李四', 1000);

模拟张三给李四转500元钱,一个转账的业务操作最少要执行下面的2条sql语句:

张三账号-500

-- 1. 张三账号-500

UPDATE account SET balance = balance - 500 WHERE id=1;

李四账号+500

-- 2. 李四账号+500

UPDATE account SET balance = balance + 500 WHERE id=2;

结果如下

367fc0fd54c55a7cf36e39c58149e3b0.png

假设当张三账号上-500元,服务器崩溃了。李四的账号并没有+500元,数据就出现问题了。我们需要保证其中一条SQL语句出现问题,整个转账就算失败。只有两条SQL都成功了转账才算成功。这个时候就需要用到事务。

事务的四大特性(A,C,I,D)

事务特性

描述

原子性(Atomicity)

事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

一致性(Consistency)

事务前后数据的完整性必须保持一致

隔离性(Isolation)

如多个用户并发访问数据库时,一个用户的事务不可以被其它用户的事务所干扰,多个用户并发事务之间数据要相互隔离,不可以互相影响

持久性(Durability)

如一个事务一旦被提交,它对数据库中的数据改变就是永久性的,就算未来数据库发生故障也不应该对数据有所影响

手动提交事务

在MySQL数据库中有两种提交事务的规则,一种是手动提交事务,一种是自动提交事务,其中自动提交事务是默认的,下面先看一下手动提交事务的案例,MySQL中有专门用于事务的SQL,如下

SQL

描述

start transaction

开始事务

commit

提交事务

rollback

回滚事务

End Transaction

事务结束

手动提交事务步骤

手动提交事务分别有两种情况,如下图

c20e88ceb90f758394ad049e9014e941.png

第1种情况:开启事务 -> 执行SQL语句 -> 成功 -> 提交事务

目前数据库内容如下

6fa4d596aae2449618d43b6d6c801a97.png

使用DOS控制台进入MySQL

执行以下SQL语句:1.开启事务, 2.张三账号-500, 3.李四账号+500

START TRANSACTION;

UPDATE account SET balance = balance - 500 WHERE id=1;

UPDATE account SET balance = balance + 500 WHERE id=2;

090a69ad77e360e9f7eecde61b61a644.png

使用Navicat查看数据库数据,发现数据库并没有变

6fa4d596aae2449618d43b6d6c801a97.png

在控制台执行commit提交任务:

fb67384b81ebe5921abda6138276d765.png

使用Navicat查看数据库:发现数据改变

ca7647266504d25f6cf424d353dc48da.png

第2种情况:开启事务 -> 执行SQL语句 -> 失败 -> 回滚事务

模拟张三给李四转500元钱(失败)目前数据库数据如下:

ca7647266504d25f6cf424d353dc48da.png

在控制台执行以下SQL语句:1.开启事务, 2.张三账号-500

START TRANSACTION;

UPDATE account SET balance = balance - 500 WHERE id=1;

84c105bc47db620aaee8a8a8acb2cf25.png

使用Navicat查看数据库:发现数据并没有改变

ca7647266504d25f6cf424d353dc48da.png

在控制台执行rollback回滚事务:

e3044fc5ebbb7d4307601929ffea20fe.png

使用Navicat查看数据库:发现数据没有改变

ca7647266504d25f6cf424d353dc48da.png

自动提交事务

MySQL的每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,执行完毕自动提交事务,MySQL默认开始自动提交事务。

52bd3ed732ae23e2f6bfce9495884518.png

将张三和李四金额重置为1000

6fa4d596aae2449618d43b6d6c801a97.png

执行以下SQL语句

UPDATE account SET balance = balance - 500 WHERE id=1;

使用Navicat查看数据库:发现数据已经改变

ca7647266504d25f6cf424d353dc48da.png

我们可以使用SQL语句查看MySQL是否开启自动提交事务

show variables like '%commit%';

-- 或

SELECT @@autocommit;

通过修改MySQL全局变量"autocommit",取消自动提交事务

b2f48a0f8aaf340ebfb186a1f360f6f2.png

0:OFF(关闭自动提交)

1:ON(开启自动提交)

取消自动提交事务,设置自动提交的参数为OFF,执行SQL语句:set autocommit = 0;

1b64d9c875aa89535e23ae048e943d6a.png

在控制台执行以下SQL语句:张三-500

UPDATE account SET balance = balance - 500 WHERE id=1;

使用Navicat查看数据库,发现数据并没有改变

6fa4d596aae2449618d43b6d6c801a97.png

在控制台执行commit提交任务

fb67384b81ebe5921abda6138276d765.png

使用Navicat查看数据库,发现数据改变

a730ec027c2f9340fffbd6ca3f20ddb6.png

MySQL事务的原理

事务开启之后, 所有的操作都会临时保存到事务日志, 事务日志只有在得到commit命令才会同步到数据表中,其他任何情况都会清空事务日志(rollback,断开连接),如下图

9ce5ec4575e7531bfc437bcc1ac614c9.png

事务的隔离级别

事务在操作时的理想状态:多个事务之间互不影响,如果隔离级别设置不当就可能引发并发访问问题。

并发访问的问题

含义

脏读

一个事务读取到了另一个事务尚未提交的数据

不可重复读

一个事务中两次读取的数据内容不一致

幻读

一个事务读取到了别的事务插入的数据,导致前后读取记录行数不同

脏读演示

674565a38d55a9833eba919b462188b9.png

不可重复读演示

5ec6534ca8656f15226fa29508786347.png

幻读演示

495a2bbbfd5b5c28782ac1685d12344d.png

MySQL数据库有四种隔离级别:上面的级别最低,下面的级别最高。“是”表示会出现这种问题,“否”表示不会出现这种问题。

级别

名称

隔离级别

脏读

不可重复读

幻读

数据库默认隔离级别

1

读未提交

read uncommitted

2

读已提交

read committed

Oracle和SQL Server

3

可重复读

repeatable read

MySQL

4

串行化

serializable

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值