系统地复习一遍MySQL的几个必会点。
文章目录
- 简介
- 演示
- 1、指定事务提交方式
- 2、通过指令操作事务
- 事务四大特性
- 并发事务问题
- 事务隔离级别
简介
事务 是一组操作(即sql语句)的集合,是一个不可分割的工作单位,事务当中的所有操作会被作为一个整体向系统提交或撤销,这些操作要么同时成功,要么同时失败。
演示
以最经典的转帐为例,需要保证转账一方和被转一方的账户余额分别同时减少和增加一个相同值,这就需要通过事务进行处理。
现有如下两个账户,账户余额分别为200,存放在account表格中。
id | name | money |
---|---|---|
1 | 张三 | 200 |
2 | 李四 | 200 |
默认情况下,执行一条DML语句,MySQL会隐式地提交事务。 所以就需要我们手动地开启事务和提交事务。假设张三向李四转账100,转账命令如下。
UPDATE account SET money = money - 100 WHERE name = '张三';UPDATE account SET money = money + 100 WHERE name = '李四';
在使用IDE的情况下,可以选中这两行执行即可模拟事务,若在MySQL命令行运行,则需要设置事务提交方式或者通过指令手动提交。
1、指定事务提交方式
-- 查看是否自动提交,是,则返回 1,否则 0
SELECT @@autocommit; -- 设置为手动提交,只针对当前会话
SET @@autocommit = 0; -- 提交事务
COMMIT;-- 回滚事务
ROLLBACK;
2、通过指令操作事务
-- 开启事务
START TRANSACTION 或 BEGIN;-- 提交事务
COMMIT;-- 回滚事务
ROLLBACK;
事务四大特性
简称为ACID,分别为:
- 原子性(Atomicity):事务是不可分割的最小操作单元,内部操作要么全部成功,要么全部失败;
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态;
- 隔离性(Isolation):保证事务在不受外部并发操作影响的独立环境下运行;
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据改变是永久的。
并发事务问题
- 脏读:一个事务读到另一个事务还没有提交的数据;
- 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读;
- 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在。
事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMMITTED | Y | Y | Y |
READ COMMITTED | N | Y | Y |
REPEATABLE READ(默认) | N | N | Y |
SERIALIZABLE | N | N | N |
-- 查看事务隔离级别
SELECT @@TRANSACTION_IOSLATION;-- 设置事务隔离级别
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {要设置的隔离级别};