1,从一张表里查询员工的岗位和部门名?
从部门表emp中取ename,从dept表去dname,没有条件限制的最终查询结果是?
select
ename,dname
from
emp,dept;
//加个条件是为了达到四选一,也是为了有效性(避免不匹配的也在一起)
select
e.ename,d.dname
from
emp e
join
dept d
on
e.deptno=d.deptno;
//加条件只是为了避免笛卡尔积现象,只是为了查询出有效的组合记录。
匹配次数一次都没有少!!!还是56次!!
- insert语句可以同时插入多个数据
desc t_user;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(32) | YES | | NULL | |
| birth | date | YES | | NULL | |
| create_date | datetime | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+
insert into t_user(id,name,birth,create_date) values(1,'zs','1980-10-11',now()),(2,'lisi','1980-10-11',now());
一次可以插入多条记录。
语法 insert into 表名(字段名1,字段名2) values(),(),()
select * from t_user;
+------+------+------------+---------------------+
| id | name | birth | create_date |
+------+------+------------+---------------------+
| 1 | jack | 2000-10-02 | 2022-02-22 14:22:50 |
| 1 | jack | 2000-10-02 | 2022-02-22 14:25:59 |
| 1 | zs | 1980-10-11 | 2022-02-22 15:18:37 |
| 2 | lisi | 1980-10-11 | 2022-02-22 15:18:37 |
+------+------+------------+---------------------+
- 快速创建表【了解内容】
create table emps as select *from emp;
原理,将一个查询结果当作一张表创建!!!!!!!!
可以完成表的快速复制!!!!!
表创建出来,同时数据也有了!!!
create table mytable as select empno,ename from emp where job=’manager’;
4,将查询结果插入到一张表中?insert相关的?
create table dept_bak as select * from dept;
insert into dep_bak select * from dept;//select的结果插入depbak表中。很少用!【了解】
- 快速删除表中的数据【truncate比较重要,必须掌握】
//删除deptbak中的数据
delete from deptbak;//这种删除数据的方式比较慢!(属于DML语句)
原理:表中的数据被删除了,但是这个数据在硬盘中真实存储空间不会被释放,!!!!!
缺点:删除效率比较低, 优点:删除后可恢复数据(误删后回滚,rollback; 即可恢复)
truncate 语句删除的原理:
删除的效率比较高,表被一次截断,物理删除。
缺点:不支持回滚
用法 :truncate table deptbak;(属于DDL语句)
大表非常大,上亿条记录,删除的话用delete,也许要执行1个小时才能删除完。
可以选择truncate语句,必须仔细询问客户是否真的要删除,并警告删除之后不可恢复!(truncate 是删除表中的数据,表还在)
删除表操作?
drop table 表名; //这不是删除表中的数据,是删除表(truncate 是删除表中的数据,表还在)
- 对表结构的增删改?
什么是对表结构的增删改?
添加一个字段,删除一个字段,修改一个字段。
对表结构的修改需要使用alter,属于DDL语句。
DDL包括:create drop alter
第一:在实际的开发中,需求一旦确定之后,表一旦设计好了之后,很少进行表结构的修改。因为开发进行中的时候,修改表的结构,成本比较高,修改表的结构,对应的java代码就需要进行大量的修改,成本是比较高的,这个责任应该由设计人承担!
第二:由于修改表的结构的操作很少,所以我们不需要掌握,如果有一天真的需要修改表结构,我们可以使用工具!!
修改表结构的操作是不需要写到java程序中的,实际上也不是java程序员的范畴。
- 约束
7.1什么是约束?
constraint 在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性,有效性!!!
作用:保证表中的数据有效
7.2常见的约束
非空约束:not null
唯一性约束:unique
主键约束:primary key (简称PK)
外键约束:foreign key (简称FK)
检查约束:check (mysql不支持,oracle支持)
我们这里重点学习四个约束:
not null
unique
primary key
foreign key
7.3.非空约束 not null(没有表级约束)
create table t_vip(id int,name varchar(255) not null);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t_vip(id,name) values(1,'zhangsan');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t_vip(id,name) values (2,'lisi');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t_vip(id) values(3);
ERROR 1364 (HY000): Field 'name' doesn't have a default value
select * from t_vip;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
+------+----------+
小插曲:xxx.sql这种文件被称为sql脚本文件。sql脚本文件中执行了大量的sql语句,我们执行sql脚本文件的时候,该文件中所有的sql语句会全部执行!批量的执行sql语句,可以使用sql脚本文件。
在mysql当中如何执行sql脚本?
mysql>source D:/....(sql文件具体路径)
在实际的工作中,第一天到了公司,项目经理会给你一个xxx.sql文件,
执行这个脚本文件,电脑上的数据库数据就有了。
7.4 唯一性约束 :unique
约束的字段不能重复,但是可以为null
drop table if exists t_vip;
Query OK, 0 rows affected (0.00 sec)
mysql> create table t_vip(id int, name varchar(255) unique,email varchar(255));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t_vip(id,name,email) values(1,'zhangsan','zhangsan@123');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t_vip(id,name,email) values(2,'lisi','lisi@123');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t_vip(id,name,email) values(3,'zhangsan','zhangsan@456');
ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'name'
null字段虽然被unique约束了,但是可以为null,且同时可以存在多个null,null和null不相等,如3的名字可以是null,4的名字也可以是null,但是不能同时为一段字符,可以同时为空
新需求:name和email 2个字段联合起来具有唯一性!!(name和email不能都相同,单独一个可以相同)
create table t_vip(id int, name varchar(255) unique,email varchar(255) unique);
//这张表这样创建是不符合新需求的,这样创建,name具有唯一性,email具有唯一性,各自唯一,互不干扰
怎么创建才能符合新需求???
create table t_vip(id int, name varchar(255) ,email varchar(255), unique(name,email));
//这样创建才符合联合起来唯一,单独可以一样,
总结:约束添加到列后面称为列级约束,没有添加到列的后面称为表级约束
什么时候需要使用表级约束?
需要给多个字段联合起来添加某一个约束的时候!
(not null 只有列级约束,没有表级约束)
unique 和not null 可以联合吗?可以!
create table t_vip(id int,name varchar(255) not null unique);
Query OK, 0 rows affected (0.00 sec)
//既不能为空也不能重复!
mysql> desc t_vip;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(255) | NO | PRI | NULL | |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
在mysql中,如果一个字段同时被not null 和unique约束的话,该字段自动变为主键字段(注意:oralce不一样)
7.5主键约束(primary key 简称PK)非常重要*****
相关术语:
主键约束
主键字段
主键值
什么是主键,有什么用?
主键值是每一行记录的唯一标识,身份证号!
注意:任何一张表都应该有主键,没有主键,表无效!!!
主键的特征:not null+unique(主键值不能为空,同时不能重复)
如:身份证号:中国不可能有相同的身份证号!名字什么的可能相同,但身份证不能为空且不可能相同
create table
t_vip(id int primary key,name varchar(255));
主键可以表级约束吗?可以!
create table
t_vip(id int ,name varchar(255),primary(id));
表级约束主要是给多个字段联合起来添加约束。
create table
t_vip(id int ,name varchar(255),email varchar(255),primary(id,name));
//id和name联合起来叫复合主键,即(id和name不能都相同,可以相同其中一部分!)
在实际开发中不建议使用复合主键,建议使用单一主键,因为主键存在的意义就是这行记录的唯一标识,只要意义达到就可,单一主键可以做到!复合主键比较复杂,不建议使用!
一个表中主键约束能加2个吗?
create table
t_vip(id int primary key,name varchar(255) primary key );
//错误,一张表只能添加一个主键约束(联合主键算一个!)!
主键值建议使用:
int
bigint
char等类型。
不建议使用:varchar来做主键!主键值一般都是数字,一般都是定长的
主键除了:单一主键和复合主键之外,还可以这样进行分类
自然主键:主键值是一个自然数,和业务没关系
业务主键:主键值和业务密切相连,例如拿银行卡号做主键值,这就是业务主键
在实际开发中使用自然主键使用多!因为主键做到不重复就行,不一定需要有意义,业务主键不好,因为一些主键一旦和业务挂钩,那么当业务发生变动的时候,可能会影响到主键值,所以业务主键不建议使用!尽量使用自然主键。
在mysql中,有一种机制可以帮助我们自动维护主键值。
create table t_vip(id int primary key auto_increment,name varchar(255));
//auto_increment表示自增,从1开始,以1递增
insert into t_vip(name) values('zhangsan');
insert into t_vip(name) values('zhangsan');
insert into t_vip(name) values('zhangsan');
insert into t_vip(name) values('zhangsan');
insert into t_vip(name) values('zhangsan');
select * from t_vip;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | zhangsan |
| 3 | zhangsan |
| 4 | zhangsan |
| 5 | zhangsan |
+----+----------+
7.6外键约束(foreign key ,简称FK)非常重要*****
oreign key(被约束的字段) references 约束表(约束的字段)
外键约束涉及到的约束语:
外键约束
外键字段
外键值
业务背景:
设计数据库表,来描述“班级和学生”的信息?
第一种:班级和学生在一张表中。。
t_student
no(PK) name classno classname
1 jack 100 湖南省。。。
2 jenny 100 湖南省。。。。。
- lili 101 湖南省
- lili 101 湖南省
- lili 101 湖南省
以上缺点:数据冗余,空间浪费,这个设计是比较失败的!
第二种:班级一张表,学生一张表?
t_student
no(PK) name cno
--------------------------------------------------------------
1 jack 100
2 jenny 100
- lili 101
4 lili 101
5 lili 101
t_class
classno(PK) classname
---------------------------------------------------------------
- 湖南省。。
- 湖南省。。。
//当cno字段没有任何约束的时候,可能会导致数据无效,可能出现一个102但是不存在这个班级!所以为了保证cno字段是有效的,需要给cno字段增加外键约束!
那么con字段就是外键字段,cno字段里的值就是外键值!
注意:t_class是父表,t_student是子表
删除顺序?
先删除子表,再删除父表
drop table if exists t_class;
drop table if exists t_student;
创建表的顺序?
先创建父,在创建子
create table t_class(classno int primary key, classname varchar(255));
create table t_student(no int primary key auto_increment,name varchar(255),cno int,foreign key(cno) references t_class(classno));
删除数据的顺序?
先删除子,再删除父
插入数据的顺序?
先插入父,再插入子
思考;子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?
不一定是主键,但是必须具有唯一性!
思考:外键值可以为null吗?
可以!
- 存储引擎(了解)
8.1什么是存储引擎,有什么用?
存储引擎是Mysql中特有的一个术语,其他数据库中没有,(oracle中有,但是不叫这个名字,存储引擎这个名字高端大气上档次)
实际上存储引擎啥一个表存储/组织数据的方式。
不同的存储引擎,表存储的方式不同。
8.2怎么给表添加/指定’存储引擎‘?
show create table t_student;
可以在建表的时候指定表的存储引擎。
CREATE TABLE `t_student` (
`no` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`cno` int(11) DEFAULT NULL,
PRIMARY KEY (`no`),
KEY `cno` (`cno`),
CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`cno`) REFERENCES `t_class` (`classno`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
在建表的时候可以在最后的小括号的“)”的右边使用:
ENGINE来指定搜索引擎
CHARSET来指定这张表的字符编码方式
结论:mysql默认的存储引擎是InnoDB
mysql默认的字符集是utf8
create table t_product(id int primary key,name varchar(255))engine=InnoDB default charset=gbk;
show create table t_product;
CREATE TABLE `t_product` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
8.3怎么查看mysql支持哪些存储引擎?
show engines \G
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 2. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 8. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 9. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
9 rows in set (0.20 sec)
//mysql 支持9 大存储引擎,当前5.5.54版本支持8个
select version(); //支持不支持得看版本
+-----------+
| version() |
+-----------+
| 5.5.54 |
+-----------+
8.4关于mysql常见的存储引擎
MyISAM 存储引擎
特征:使用三个文件表示每个表
格式文件:存储表结构的定义(mytable.frm)
数据文件:存储表行的内容(mytable.MYD)
索引文件:存储表上索引(mytable.MYI)---索引是一本书的目录,提高查询效率,缩小扫描范围
提示一下:对于一张表来说,只要是主键,或者加unique约束的字段都会自动创建索引
优势:可被转换为压缩、只读表来节约空间
不支持事务机制,安全性低¥!
InnoDB存储引擎
这是mysql默认的存储引擎,同时也是重量级的存储引擎,
支持事务,支持数据库崩溃后自动恢复机制,
主要特点:非常安全
但是效率不是很高,并且不能被压缩,不能转换为只读,不能很好存储空间
特征:-每个InnoDB表在数据库目录中以 .frm格式文件表示
-InnoDB表空间tablespace被用于存储表的内容(表空间是一个逻辑名称表空间存储数据)
-提供一组用来记录事务性活动的日志文件
-用COMMIT(提交)。SAVEPOINT、及ROLLBACK(回滚)支持事务处理
-提供全ACID兼容
-在mysql服务器崩溃后提供自动恢复
-多版本(MVCC)和行级锁定
-支持外键以及引用的完整性,包括级联删除和更新
MEMORY存储引擎
数据存储在内存中,且行的长度固定,这2个特点使得它非常块
特征:-在数据库目录中,每个表均以.frm格式的文件表示
-表数据以及索引被存储在内存中(目的就是快),
-表级锁机制
-不能包含TEXT或BLOB字段
MEMORY以前被称为HEAP引擎
优点:查询效率是最高的!
缺点:不安全,关机之后数据就会消失,因为数据和索引在内存中
(内存是直接取,光速,电流的速度,从硬盘取,硬盘是机械行为,相对慢)
9事务(重点,核心,必须理解掌握**********)
9.1什么是事务?
事务其实就是一个完整的业务逻辑,是一个最小的工作单元,不可再分。
假设转账。从a账户向b账户转账100,
将a账户减100,(update语句)
b账户加100,(update语句)
这就是一个完整的业务逻辑
以上的操作是一个最小的操作单元,要么同时成功,要么同时失败。
2个updtae语句必须同时成功或者失败
9.2只有DML(Data Manipulation Language 数据操纵语言)语句才有事务一说,其他语句与事务无关!!!
insert
delete
update
只有以上三个语句是数据库表中数据进行增删改,只要你的操作一旦涉及到数据的增删改,那么就一定要考虑安全问题
数据安全第一位!!!
9.3假设所有的业务,只要一条DML就能完成,还有必要存在事务机制吗?
正是做某些事需要多条DML语句共同联合才能完成,事务才有意义!
到底什么是事务?
说到底,就是多个DML语句要么同时成功或者同时失败!
事务就是批量的DML语句
9.4事务是如何实现同时失败或者成功的?
InnoDB存储引擎:提供了一组用来记录事务性活动的日志文件
事务开起了:
insert
update
delete
事务结束了!
在事务的执行过程中,每一条DML的操作都会记录到”事务性活动的日志中“
我们可以提交业务,也可以回滚业务。
提交事务?
清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中。
提交事务标志事务的结束,是全部成功的结束
回滚事务?
将之前的DML操作全部撤消,并且清空事务性活动的日志文件
回滚事务标志着事务的结束,并且是全部失败的结束
9.5怎么提交和回滚事务?
提交:commit;语句
回滚:rollback;语句(回滚永远只能回滚到上一次的提交点)
事务对应的单词是:transaction
测试一下:在mysql中默认的事务行为是怎么样的?
mysql默认情况下是支持自动提交业务的(自动提交)
什么是自动提交?
每执行一条DML语句,则提交一次!这种自动提交通常不符合我们开发习惯,因为一个业务通常需要多条DML语句共同执行才能完成!为了数据安全,必须同时成功之后在提交,所以不能执行一句提交一句
怎么将mysql中的自动提交事务关掉?
先执行:start transaction;
再提交:commit;手动提交(提交后就不支持回滚了,没执行commit语句之前支持回滚)
---------------------------------------------------------测试一-------------------------------------------
select * from t_vip;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | zhangsan |
| 3 | zhangsan |
| 4 | zhangsan |
| 5 | zhangsan |
+----+----------+
start transaction;
Query OK, 0 rows affected (0.00 sec)
insert into t_vip(name) values('ss');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t_vip(name) values('ss');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t_vip(name) values('ss');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t_vip(name) values('ss');
Query OK, 1 row affected (0.00 sec)
select * from t_vip;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | zhangsan |
| 3 | zhangsan |
| 4 | zhangsan |
| 5 | zhangsan |
| 6 | ss |
| 7 | ss |
| 8 | ss |
| 9 | ss |
+----+----------+
9 rows in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t_vip;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | zhangsan |
| 3 | zhangsan |
| 4 | zhangsan |
| 5 | zhangsan |
+----+----------+
5 rows in set (0.00 sec)
//回滚到上一次事务提交的地方,即开启了事务的地方(关闭自动提交的地方)。
可以手动提交:commit;语句即可。提交后不支持回滚了!
--------------------------------------------测试二------------------------------------------
select * from t_vip;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | zhangsan |
| 3 | zhangsan |
| 4 | zhangsan |
| 5 | zhangsan |
+----+----------+
start transaction;
Query OK, 0 rows affected (0.00 sec)
insert into t_vip(name) values('ss');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t_vip(name) values('ss');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t_vip(name) values('ss');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t_vip(name) values('ss');
Query OK, 1 row affected (0.00 sec)
select * from t_vip;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | zhangsan |
| 3 | zhangsan |
| 4 | zhangsan |
| 5 | zhangsan |
| 6 | ss |
| 7 | ss |
| 8 | ss |
| 9 | ss |
+----+----------+
9 rows in set (0.00 sec)
mysql>commit;
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
elect * from t_vip;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | zhangsan |
| 3 | zhangsan |
| 4 | zhangsan |
| 5 | zhangsan |
| 6 | ss |
| 7 | ss |
| 8 | ss |
| 9 | ss |
+----+----------+
9 rows in set (0.00 sec)
//提交之后回滚无效!!
9.6事务的四个特性
ACID
A 原子性
说明事务是一个最小的工作单元,不可再分
C一致性
所有事务要求,在同一个事务中,所有操作必须同时成功,或者同时失败
I 隔离性
a事务和b事务具有一定距离
a事务操作这张表,b也操纵这张表会怎么样?
多线程并发访问这张表一样,
D 持久性
事务最终结束的一个保障,事务提交,就相对于将没有保存到硬盘上的数据保存到硬盘上
9.7重点研究隔离性
a教师和b教室中间有一道墙,可以很厚也可以很薄。这就是事务的隔离级别
事务和事务的隔离级别有哪些?
四个级别
读未提交:read uncommitted(最低)《没有提交就读到了》
事务a可以读取到事务b未提交的数据,这种隔离级别存在的问题是:
存在脏读现象(Dirty Reaad)我们称存在脏数据!
这种隔离级别通常是理论上的,大部分数据库隔离都是二级起步的!
读已提交:read committed《提交之后才读到》
事务a只能提取到b已经提交的数据,解决了脏读现象
存在问题:不可重复读取数据。
在事务开启之后,第一次读到的数据是三条,当前事务还没有结束,可能第二次再读取的时候,读到的数据是4条,3不等于4称为不可重复读取。
这种隔离级别是比较真实的数据,每一次读到的数据绝对真实.
oracle数据库默认的隔离级别是read committed;
可重复读:repeatable read《提交之后也读不到》永远读取到的都是刚开启事务时的数据
事务a开启之后,不管是多久,每一次事务a中读取到的数据都是一致的,即使事务b将数据已经修改,并且已经提交了,事务a读取到的数据也没有改变,
解决了不可重复读取数据
问题:会出现幻影。每次读取的数据都是幻象,不真实,
如:早上九点开启了事务,只要事务不结束,晚上九点,读到数据还是一样
mysql中默认的事务隔离级别就是repeatable read!!!!
序列化:serializable(最高)
这是最高隔离级别,效率最低,解决了所有问题!
这种隔离级别表示事务排队,不能并发!
优点:synchronized 线程同步(事务同步)
每一次读到的数据都是最真实的,并且效率最低的
9.8验证隔离级别
查看隔离级别:select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
同时打开2个cmd窗口
验证:read uncommitted
设置隔离级别:set global transaction isolation level read uncommtted;
事务a 事务b
use xxx;
use xxx;
start transaction;
select * from t_user;
start transaction;
insert into t_user(name) values(‘liu’);
select * from t_user;//此时可以发现b还未commit a就已经能看到数据了
验证read committed
设置隔离级别:set global transaction isolation level read committed;
事务a 事务b
use xxx;
use xxx;
start transaction;
start transaction;
select *from t_user;
insert.................
select * from t_user;//此时查不到
commit;
select * from t_user;//,只能查到已经提交的数据,此时能查到
验证 repeatable read
设置隔离级别:set global transaction isolation level repeatable read;
事务a 事务b
use xxx;
use xxx;
start transaction;
start transaction;
select *from t_user;
insert.................
insert.................
commit;
select *from t_user;//会发现和上一次的查询结果是一样的,即使b已经提交了数据
验证serializable
设置隔离级别:set global transaction isolation levelserializable;
事务a 事务b
use xxx;
use xxx;
start transaction;
start transaction;
select *from t_user;
insert。。。。
select * from ...//此时这里会卡着不动。。。
commit;
//此时b的select语句才会出结果!