事务
- 概述:如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
事务的四大特征
特性 | 作用 |
---|---|
原子性 | 事务是不可分割的最小操作单元,要么同时成功,要么同时失败 |
持久性 | 当事务提交或回滚后,数据库会持久化保存数据 |
隔离性 | 多个事务之间,相互独立 |
一致性 | 事务操作前后,数据总量不变 |
事务操作
事务命令 | 作用 |
---|---|
start transaction; | 开启事务 |
rollback; | 回滚 |
commit; | 提交 |
-
代码示例
-- 创建一个数据库 CREATE DATABASE IF NOT EXISTS test CHARACTER SET utf8; -- 使用数据库 USE test; -- 创建一个账户表 CREATE TABLE account( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), balance DOUBLE ); -- 向账户表中添加数据 INSERT INTO account(name , balance) VALUES('张三',1000),('李四',1000); -- 查询账户表 SELECT * FROM account; -- 转账操作,张三给李四转 500 元 -- 1、开启事务 START TRANSACTION; -- 2、张三账户转出 500 UPDATE account SET balance = balance - 500 WHERE name = '张三'; -- 错误 SET; -- 3、李四账户转入 500 UPDATE account SET balance = balance + 500 WHERE name = '李四'; -- 发现问题,回滚事务 ROLLBACK; -- 查询账户 SELECT * FROM account; -- 将错误删除,发现执行没有问题,提交事务 COMMIT;
我们可以看到,当开启事务,在事务中遇见错误,进行回滚这样就回滚到操作之前的状态,如果没有问题,提交即可。
-
MySQL 数据库中 事务 默认自动提交。
事务提交的两种方式
自动提交
- MySQL 自动提交事务,一条 DML(增删改) 语句会自动提交一次事务
手动提交
- Oracle 默认手动提交事务,需要先开启事务,再提交
修改事务提交方式
-
查看事务的默认提交方式
-- 数值:1、自动提交 0、手动提交 SELECT @@AUTOCOMMIT;
-
修改提交方式
-- 根据需求设置值 SET @@AUTOCOMMIT = 0;
事务的隔离级别
-
概述:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
-
存在问题
- 脏读:一个事务,读取到另一个事务中没有提交的数据
- 不可重复读(虚读):在同一个事务中,两次读取到的数据不一样
- 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
-
隔离级别
命令 作用 产生问题 read uncommitted 读未提交 脏读、不可重复读、幻读 read committed 读已提交 (Oracle) 不可重复读、幻读 repeatable read 可重复读 (MySQL默认) 幻读 serializable 串行化(锁表的操作) 可以解决所有的问题 -
注意:隔离级别从小到大安全性越来越高,但是效率越来越低
-
数据库查询隔离级别
select @@tx_isolation; -- mysql8后 SELECT @@transaction_isolation;
-
数据库设置隔离级别
set global transaction isolation level 级别字符串;