目录
基本概念
含义
事务管理:数据库中确保数据一致性以及完整性的一种机制。事务是一个包含多个操作的逻辑单元,这些操作要么全部执行成功,要么全部回滚,不会影响数据库的状态
- 理解:假如参加某平台会员后,当退出会员机制的时候,通过你的ID,会将你的所有信息从会员存储系统中清除,这一整个删除数据的过程,就可以称为一个事务
- 数据库中同一时刻会有很多的事务在同时进行
事务管理使用原因
- 确保数据完整性:通过事务ACID特性,数据库能够在复杂操作中保持数据一致性和完整性
- 支持并发操作:通过事务隔离级别,控制多个事务并发执行的时候相互影响,防止数据冲突
- 可以简单理解为,防止多人去查看同一数据时,出现不一致的情况
事务常见操作
常见操作总结
- BEGIN:开始一个事务。
- COMMIT:提交事务,将所有操作永久保存到数据库。
- ROLLBACK:回滚事务,撤销事务中的所有操作。
事务版本
登录进入数据库后,查看是否使用engines数据库引擎
事务提交方式
查看提交方式,正常有两种提交方式,手动提交和自动提交
- 下文示例操作:开启和关闭自动提交
常见操作实践
设置成读未提交
一个数据库创建表,另一个数据库查看表
事务的开始与回滚
- 启动事务:启动事务后的所有操作,都属于同一事务的操作
一个数据库插入数据后,另一个数据库可以立刻看到,同时设置保存点,回滚使用
回滚事务,数据库变化
事务提交,提交后就无法再进行回滚了
事务错误处理机制分析
重要结论总结
- 当开启事务的时候,即begin或者start transaction,事务必须通过commit进行提交,提交后的数据才会持久化,与是否设置set autocommit无关
- 事务可以实现手动回滚,当出现异常的时候,MySQL会自动回滚
- 针对于InnoDb会将每一条SQL语句封装成事务,然后自动提交
- 事务本身是具有原子性以和持久性的
commit之前,客户端崩溃,MySQL会自动回滚到之前信息
事务提交后,客户端崩溃,MySQL中的数据不会受到影响,因为数据已经持久化了
begin会自动更改提交方式,不会受到MySQL是否自动提交的影响
开启默认提交后,数据库终端异常崩溃后,数据仍然可以持久化存储在数据库中
事务四大特性
- 原子性
- 含义:事务中的所有操作要么全部成功,要么全部失败并回滚,事务是不可分割的
- 作用:确保部分操作失败的时候,数据库不会留下不完整的数据
- 一致性
- 含义:事务执行前后,数据库必须保持一致性,符合预设的规则和约束
- 作用:确保事务完成后,数据库从一个合法状态转换为另一个合法状态
- 隔离性
- 含义:多事务并发的时候,一个事务的操作对于其他事务操作失隐藏的,直到该事务提交
- 作用:避免并发事务之间的干扰,防止数据不一致
- 持久性
- 含义:一旦事务提交,结果将永远保存在数据库中,即使系统崩溃也不会丢失
- 作用:确保事务完成后数据持久保存
//测试代码
CREATE DATABASE bank;
USE bank;
CREATE TABLE accounts (
account_id INT PRIMARY KEY,
account_name VARCHAR(50),
balance DECIMAL(10, 2)
);
INSERT INTO accounts (account_id, account_name, balance) VALUES
(1, 'Account1', 1000.00),
(2, 'Account2', 500.00);
原子性:模拟转账行为,执行commit之前程序崩溃,验证事务会自动回滚
一致性:验证转账后,所有账户的总额不变
隔离性:多个事务同时执行,避免数据冲突,具体要根据隔离性
持久性:事务一旦提交,数据就会永久的存储在数据库中,即使系统崩溃也不会造成数据丢失
事务隔离级别
数据库为保证事务执行过程中减少其他事件的干扰,所以需要对干扰进行隔离,其又针对干扰的不同程度,设计出干扰级别。
- 未提交读:事务可以读取其他未提交事务的数据,可能导致脏读
- 提交读:事务只能读取已提交的数据,避免脏读,但可能出现不可重复读,该级别也是多数数据库默认的方式
- 可重复读:保证事务在执行期间看到的数据一致,防止不可重复读,但是可能会出现幻读
- 可串行化:最高级别隔离,确保事务按顺序执行,避免所有并发问题,但是性能最差,有可能会导致超时和锁竞争问题,所以很少会去使用
CREATE DATABASE isolation_test;
USE isolation_test;
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(50),
quantity INT
);
INSERT INTO products (product_id, product_name, quantity) VALUES
(1, 'ProductA', 100),
(2, 'ProductB', 50);
未提交读:其他终端可以读取还未提交的更新的数据,终端2看到的内容总是根据终端1实时更新
提交读:只可以读取已经提交的数据
可重复读:确保在终端1的同一事务中,多次读取的事务一致
可串行化:终端1事务提交之前,终端2的操作将被阻塞,确保事务按顺序执行