事务
- 事务是一组操作的集合,它是一个不可分割的工作单位,事务会将一组操作作为一个整体向系统提交或撤销请求,这组操作要么同时执行,要么同时失败
@@autocommit系统自动提交事务的开关
-- @@autocommit参数可以开启与关闭自动提交事务的(系统默认为开启)
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set (0.01 sec)
-- 关闭
mysql> set @@autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 0 |
+--------------+
1 row in set (0.00 sec)
事务操作
方式一:关闭了@@autocommit=0
-- 关闭了系统自动提交事务,使用commit提交事务,出现异常使用rollback回滚操作
mysql> update account set money=money-1000 where name='张三';
mysql> update account set money=money+1000 where name='李四';
mysql> commit;
-- 模拟语句执行中发生异常
mysql> update account set money=money-1000 where name='张三';
mysql> 发生异常了。。。。
mysql> update account set money=money+1000 where name='李四'; #此时这条语句未执行
mysql> rollback; #回滚事务
方式二:开启@@autocommit=1
-- 系统默认开启自动提交事务,使用begin 或 start transaction手动开启事务,commit结束,rollback回滚
mysql> begin;
mysql> update account set money=money-1000 where name='张三';
mysql> update account set money=money+1000 where name='李四';
mysql> commit;
事务的特性(面试)
- 原子性:系统必须视事务为最小的执行单元,事务中有任何语句执行出错都必须返回到事务执行前的状态。
- 一致性:在事务处理时,无论成功还是失败,都必须保证数据库系统不会返回到一个未处理的事务中,mysql的一致性通过日志机制来实现。
- 隔离性:在并发处理多个事务时,多个事务间互不影响,保证未完成的事务与数据库系统隔离。
- 持久性:事务一旦提交或撤销,这样的修改是永久性的。
并发事务问题
- 脏读:一个事务读取到另一个事务还未提交的数据。
- 不可重复读:一个事务先后读取同一条记录,但两次读取的结果不一致(其他事务已提交修改)。
- 幻读:一个事务在查询一条记录时,没发现记录行,但是在执行插入或删除该条数据时,发现该记录已经存在(其他事务插入或删除数据)。
事务隔离级别
| 隔离级别 |
脏读 (Dirty Read) |
不可重复读 (Non-repeatable Read) |
幻读 (Phantom Read) |
| 读未提交 (Read Uncommitted) |
可能 |
可能 |
可能 |
| 读已提交 (Read Committed) |
不可能 |
可能 |
可能 |
| 可重复读 (Repeatable Read) |
不可能 |
不可能 |
可能 |
| 序列化 (Serializable) |
不可能 |
不可能 |
不可能 |
-- 查看事务隔离级别
select @@transaction_isolation
-- 设置事务隔离级别语法
set [session|global] transaction isolation level [read uncommitted|read committed|repeatable read|serializable]
session:表示只在当前会话的隔离级别
global:表示全局会话的隔离级别