数据库的学习笔记03

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次!!

  1. 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 |

+------+------+------------+---------------------+

  1. 快速创建表【了解内容】

  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表中。很少用!【了解】

  1. 快速删除表中的数据【truncate比较重要,必须掌握】

//删除deptbak中的数据

delete from deptbak;//这种删除数据的方式比较慢(属于DML语句)

原理:表中的数据被删除了,但是这个数据在硬盘中真实存储空间不会被释放,!!!!!

缺点:删除效率比较低, 优点:删除后可恢复数据(误删后回滚,rollback; 即可恢复)

truncate 语句删除的原理:

删除的效率比较高,表被一次截断,物理删除

缺点:不支持回滚

用法 :truncate table deptbak;(属于DDL语句)

大表非常大,上亿条记录,删除的话用delete,也许要执行1个小时才能删除完。

可以选择truncate语句,必须仔细询问客户是否真的要删除,并警告删除之后不可恢复!(truncate 是删除表中的数据,表还在)

删除表操作?

drop table 表名; //这不是删除表中的数据,是删除表(truncate 是删除表中的数据,表还在)

  1. 对表结构的增删改?

什么是对表结构的增删改?

添加一个字段,删除一个字段,修改一个字段。

对表结构的修改需要使用alter,属于DDL语句。

DDL包括:create drop alter

第一:在实际的开发中,需求一旦确定之后,表一旦设计好了之后,很少进行表结构的修改。因为开发进行中的时候,修改表的结构,成本比较高,修改表的结构,对应的java代码就需要进行大量的修改,成本是比较高的,这个责任应该由设计人承担!

第二:由于修改表的结构的操作很少,所以我们不需要掌握,如果有一天真的需要修改表结构,我们可以使用工具!!

修改表结构的操作是不需要写到java程序中的,实际上也不是java程序员的范畴。

  1. 约束

 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                湖南省。。。。。

  1. lili 101 湖南省
  2. lili 101 湖南省
  3. lili 101 湖南省

 以上缺点:数据冗余,空间浪费,这个设计是比较失败的!

第二种:班级一张表,学生一张表?

t_student

no(PK) name cno

--------------------------------------------------------------

1           jack        100

2           jenny        100

  1. lili 101

4 lili 101

5 lili 101

t_class

classno(PK)             classname

---------------------------------------------------------------

  1. 湖南省。。
  2. 湖南省。。。

 //当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吗?

可以!

  1. 存储引擎(了解)

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语句才会出结果!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值