MySQL事务

本文详细解释了事务的概念、事务的四个属性(原子性、一致性、隔离性、持久性),展示了如何在MySQL中使用事务,包括事务的版本支持、提交方式、常见操作和隔离级别的理解与设置。强调了事务在数据库操作中的重要性和不同隔离级别对并发性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言:

什么是事务? 

事务的版本支持

事务的提交方式

事务的常见操作

正常操作--演示证明事务回滚

不正常操作--证明未commit,客户端崩溃,事务自动回滚 

不正常操作--证明commit了,客户端崩溃,但是数据不会被影响

不正常操作--证明begin操作会自动更改提交方式,不受MySQL是否自动提交的影响

结论: 

事务隔离级别

如何理解隔离性: 

隔离级别:

 查看和设置隔离性:

读未提交(Read Uncommitted):

读提交(Read Committed):

可重复读(Repeatable Read):

 串行化(Serializable):

结论:

 ​编辑

 一致性(Consistency):


前言:

如果CURD不加控制,会有什么问题?

 

CURD满足什么属性,能解决上述问题?

  1. 买票的过程必须是原子的吧
  2. 买票互相应该不能影响
  3. 买好票应该要永久有效吧
  4. 买前,买后的状态应该要很明确的 

什么是事务? 

 事务就是一组DML语句构成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不同的。

事务主要用在处理操作量大,复杂度高的数据。好比转账,你要将钱从手机上转钱给另外一个人,这时候就会有一堆MySQL语句:查询,修改等待,这样一堆的SQL语句加起来构成一个事务

正如我们上面所说,一个 MySQL 数据库,可不止你一个事务在运行,同一时刻,甚至有大量的请求被包装成事务,在向 MySQL 服务器发起事务处理请求。而每条事务至少一条 SQL ,最多很多 SQL ,这样如果大家都访问同样的表数据,在不加保护的情况,就绝对会出现问题。甚至,因为事务由多条 SQL 构成,那么,也会存在执行到一半出错或者不想再执行的情况,那么已经执行的怎么办呢?

 所以一个完整的事务,绝对不是简单的sql集合,还要满足以下四个属性:

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作
  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交( Readuncommitted )、读提交( read committed )、可重复读( repeatable read )和串行化( Serializable )
  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

 上面四个属性简称为ACID

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(lsolation)
  • 持久性(Durability)

事务的版本支持

在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务,MyISAM不支持 

  • Transactions:YES 代表支持事务
  • Savepoints:YES 代表支持事务保存点

SET AUTOCOMMIT=0 # SET AUTOCOMMIT=0 禁止自动提交 1就是开启自动提交

事务的提交方式

常见的提交方式有两种:

  • 自动提交
  • 手动提交 

查看事务的提交方式:

show variables like 'autocommit'

用SET来改变MySQL的自动提交模式:

SET AUTOCOMMIT=0;       #SET AUTOCOMMIT=0 禁止自动提交 1就是自动提交

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+


事务的常见操作

  •  创建测试表:
create table if not exists account(
 id int primary key,
 name varchar(50) not null default '',
 blance decimal(10,2) not null default 0.0
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;
  • 正常操作--演示证明事务回滚

mysql> start transaction;        -- 开始一个事务begin也可以,推荐begin
Query OK, 0 rows affected (0.00 sec)

mysql> savepoint save1;         -- 创建一个保存点save1
Query OK, 0 rows affected (0.00 sec)

mysql> insert into account values (1, '张三', 100);  -- 插入一条记录
Query OK, 1 row affected (0.05 sec)

mysql> savepoint save2;         -- 创建一个保存点save2
Query OK, 0 rows affected (0.01 sec)

mysql> insert into account values (2, '李四', 10000);  -- 在插入一条记录
Query OK, 1 row affected (0.00 sec)

mysql> select * from account;       -- 两条记录都在了
+----+--------+----------+
| id | name   | blance   |
+----+--------+----------+
| &nb
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Obto-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值