7.1 概述
事务的含义:一条或多条SQL语句组成执行单元,这一组SQL要么都执行,要么都不执行
事务的特点:
- 原子性:一个事务是不可再分割的整体,要么都执行,要么都不执行
- 一致性:一个事务可以使数据从一个一致状态切换到另一个一致状态
- 隔离性:一个事务不受其他事务的干扰和影响,多个事务是相互隔离的
- 持久性:一个事务一旦提交,则永久的持久化到本地
7.2 事务的使用步骤
- 开启事务
set autocommit = 0;start transaction; # 可以不写
- 编写一组逻辑SQL语句
- 结束事务
如何设置回滚点:
在逻辑SQL语句中设置回滚点,
savepoint 回滚点名
然后rollback 回滚点名就可以回滚到指定回滚点
7.3 事务的并发问题
- 事务的并发是如何发生的?
多个事务同时操作同一个数据库的同一个数据的时候,就会发生并发
- 并发问题有哪些?
- 脏读:一个事务读取了其他事务还没有提交的数据,只是读到的是其他事务“更新的数据”
- 不可重复读:一个事务多次读取同一数据,结果不一样
- 幻读:一个事务读取了其他事务还没有提交的数据,只是读到的是其他事务“插入的数据”
- 如何解决并发问题?
通过设置隔离级别来解决这些并发问题
- 隔离级别有哪些?
- read uncommitted:读未提交
- read committed:读已提交
- repeatable:可重复读
- serializable:串行化
各个隔离级别能解决的问题:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| read uncommitted:读未提交 | 不能解决 | 不能解决 | 不能解决 |
| read committed:读已提交 | 可以解决 | 不能解决 | 不能解决 |
| repeatable:可重复读 | 可以解决 | 可以解决 | 可以解决 |
| serializable:串行化 | 可以解决 | 可以解决 | 可以解决 |
7.4 设置隔离级别
每启动一个 mysql 程序, 就会获得一个单独的数据库连接。每个数据库连接都有一个全局变量 @@tx_isolation, 表示当前的事务隔离级别
Mysql 支持 4 种事务隔离级别。 Mysql 默认的事务隔离级别为: REPEATABLE READ。在mysql中REPEATABLE READ的隔离级别也可以避免幻读了。
查看当前的隔离级别:SELECT @@tx_isolation;
查看全局的隔离级别:SELECT @@global.tx_isolation;
设置当前MySQL连接的隔离级别,语句如下:
set tx_isolation ='隔离级别';
设置数据库系统的全局隔离级别,语句如下:
set global tx_isolation ='隔离级别';
