目录
3.3.1 ERROR 1193 (HY000): Unknown system variable 'tx_isolation'
一、概述
1.1 什么是事务?
事务:一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
1.2 数据库引擎
概念:在mysql中的数据用各种不同的技术存储在文件(或内存)中。
操作:
查看mysql支持的存储引擎:
show engines;
常用的数据库引擎:MyISAM、InnoDB、MEMORY。
面试题:MyISAM 与 InnoDB 区别?
对比项 | MyISAM | InnoDB |
---|---|---|
主外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作 | 行锁,操作时只锁住一行,不对其它行有影响 适合高并发操作 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还要缓存真实数据,对内存要求极高,而且内存大小对性能有决定性影响 |
表空间 | 小 | 小 |
关注点 | 性能 | 事务 |
默认安装 | Y | Y |
1.3 事务的特性
事务的ACID特性:
原子性(Atomicity):是不可分割的最小操作单位,要么同时成功,要么同时失败。
一致性(Consistency):保证数据的状态操作前和操作后保持一致。
隔离性(Isolation):多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰。
持久性(Durability):当事务提交或回滚后,数据库会持久化的保存数据。
二、事务创建
2.1 创建步骤
1. 开启事务
2. 编写事务逻辑操作单元
3. 提交事务或回滚事务
#取消自动提交事务
SET autocommit = 0;
#开启事务
START TRANSACTION;
语句1;
语句2;
...
语句n;
#提交或回滚事务
COMMIT;
ROLLBACK;
回滚:回到数据操作之前的状态。
2.2 事务分类
隐式事务:没有明显的开启和结束事务的标志。
显式事务:具有明显的开启和结束事务的标志。
三、事务的隔离级别
3.1 并发问题
3.1.1 如何产生?
当多个事务同时操作同一个数据库的相同数据时。
3.2.2 并发问题分类
- 脏读:一个事务读取到了另外一个事务未提交的数据。
- 不可重复读:同一个事务中,多次读取到的数据不一致。
- 幻读:一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据。
3.2 解决并发问题
设置隔离级别。
事务隔离级别:
√即代表会出现的情况。
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
READ UNCOMMITTED | √ | √ | √ |
READ COMMITTED | × | √ | √ |
REPEATABLE READ(MySQL默认隔离级别) | × | × | √ |
SERIALIZABLE | × | × | × |
注:隔离级别从小到大安全性越来越高,但是效率越来越低。
3.3 隔离级别设置
#设置隔离级别
SET SESSION|GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别名;
#查看隔离级别
SELECT @@tx_isolaction;
3.3.1 ERROR 1193 (HY000): Unknown system variable 'tx_isolation'
在这里需要注意一个点:在查看隔离级别的时候可能会报一个错:
ERROR 1193 (HY000): Unknown system variable 'tx_isolation'
不要着急,我们先翻译一下错误,这段英文的意思是未知系统变量,就是说MYSQL中没有这个变量,这是为什么呢?
这是因为由于MySQL数据库的更新,在旧版本中tx_isolation是作为transaction_isolation的别名被应用的,新版本已经被弃用了,所以会显示未知系统变量。
那怎么解决呢?
把tx_isolation换成transaction_isolation就可以了!