Mysql之事务(上)

🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客

🌅主页:猫咪-9527-CSDN博客

"欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。"

目录

1.什么需要为事务?

2.事务的四个特性

[1. 原子性(Atomicity)](#1. 原子性(Atomicity))

[2. 一致性(Consistency)](#2. 一致性(Consistency))

[3. 隔离性(Isolation)](#3. 隔离性(Isolation))

[4. 持久性(Durability)](#4. 持久性(Durability))

3.事务的引擎版本支持

4.事务的常见操作方式

4.1事务的提交方式

4.1.1查看当前的提交方式

[​编辑 4.1.2改变当前的提交方式](#编辑 4.1.2改变当前的提交方式)

4.2事务的常见简单方式

4.2.1查看系统的默认隔离级别

4.2.2创建测试表


1.什么需要为事务?

事务的存在是为了保证数据的完整性、一致性、隔离性和持久性(即ACID原则),尤其在面对错误、并发和系统崩溃等不确定性时,能够确保数据库处于一个可靠和一致的状态。

  • 保证数据一致性
    • 如果在一个操作过程中,部分成功、部分失败,事务可以保证要么所有操作成功,要么所有操作都回滚,避免数据库处于不一致的状态。
  • 处理错误和异常
    • 在应用程序操作数据库时,可能会遇到各种意外情况,比如断电、网络问题等。事务能够在发生异常时保证数据库恢复到操作前的状态。
  • 简化并发控制
    • 多个用户同时操作数据库时,事务确保了并发操作的正确性,不会出现数据竞争或修改错误。比如两个用户同时修改同一条数据时,事务能够控制他们的操作顺序。
  • 提高程序可靠性
    • 对于开发者来说,事务提供了一种简化的编程模型,不需要编写复杂的错误处理逻辑。开发者只需关注如何设计业务逻辑,数据库的事务机制自动保证数据的一致性和完整性。

因此事务本质上是为了应用层服务而特别创建的,而不是伴随着数据库系统天生就有的。

2.事务的四个特性

1. 原子性(Atomicity)
  • 事务中的一组操作要么全部成功,要么全部失败。如果在某个操作发生错误或中断,系统将回滚到事务开始时的状态,确保不会出现部分操作完成的问题。
2. 一致性(Consistency)
  • 在事务开始前和结束后,数据库必须保持一致的状态。如果事务执行后数据不符合预设的约束条件(如外键、唯一性等),则事务会被回滚。
3. 隔离性(Isolation)
  • 每个事务的执行不应受到其他事务的干扰,保证事务的执行过程是独立的。常见的并发问题包括脏读、不可重复读和幻读,隔离性解决了这些问题。
4. 持久性(Durability)
  • 一旦事务提交,所有的更改都会永久保存在数据库中,即使系统崩溃也能恢复。

3.事务的引擎版本支持

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

4.事务的常见操作方式

4.1事务的提交方式
  • 主动提交
  • 自动提交
4.1.1查看当前的提交方式
复制代码
show variables like 'autocommit';
4.1.2改变当前的提交方式

|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| 关闭自动提交 | 开启自动提交 |
| set autocommit=0; | set autocommit=1; |
| | |

4.2事务的常见简单方式

4.2.1查看系统的默认隔离级别
复制代码
select @@tx_isolation;
4.2.2创建测试表

创建表:

复制代码
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;

开始事务:

方案一:

复制代码
begin;

方案二:

复制代码
start transaction;

简单回滚演示:

Mysql当发生客户端崩溃时,未主动commit的事务,会主动回滚,不受是否自动提交的影响

|-------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| 主动提交 | 未主动提交 |
| | |
| 数据存在 | 数据回滚,丢失 |

|-------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| 自动提交开 | 自动提交关 |
| | |
| | |

结论:

  • 只要输入begin或者start transaction,事务便必须要通过commit提交,才会持久化,与是否设置set autocommit无关。
  • 事务可以手动回滚,同时,当操作异常,MySQL会自动回滚
  • 对于InnoDB 每一条SQL 语言都默认封装成事务,自动提交。(select有特殊情况,MySQL 有MVCC )
  • 从上面的例子,我们能看到事务本身的原子性(回滚),持久性(commit)

事务操作注意事项

  • 如果没有设置保存点,也可以回滚,只能回滚到事务的开始。直接使用 rollback(前提是事务还没有提交)
  • 如果一个事务被提交了(commit),则不可以回退(rollback)
  • 可以选择回退到哪个保存点
  • InnoDB 支持事务, MyISAM 不支持事务
  • 开始事务可以使 start transaction 或者begin
相关推荐
blurblurblun22 分钟前
Redis实战(7)-- 高级特性 Redis Stream数据结构与基础命令
数据库·redis·缓存
永卿0011 小时前
mysql 日志机制
数据库·mysql
wu~9701 小时前
Mysql深入学习:慢sql执行
mysql
先鱼鲨生1 小时前
etcd 的安装与使用
数据库·etcd
crossoverJie3 小时前
StarRocks 如何在本地搭建存算分离集群
数据库·后端
潇凝子潇3 小时前
如何在不停机的情况下,将MySQL单库的数据迁移到分库分表的架构上?
数据库·mysql·架构
Tapdata3 小时前
什么是 Operational Data Hub?它因何而生,又为何能够在当下成为技术共识?
数据库
Seven973 小时前
Mysql的索引数量是否越多越好?为什么?
mysql
这里有鱼汤4 小时前
普通人做量化,数据库该怎么选?
数据库·后端
BOOM朝朝朝4 小时前
Mongo索引
数据库·后端