🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客
🌅主页:猫咪-9527-CSDN博客“欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。”
目录
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改变当前的提交方式
关闭自动提交 | 开启自动提交 |
|
|
![]() |
![]() |
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