이 글은 설계 소개, 다중 테이블 쿼리, 트랜잭션 연산 등 데이터베이스 설계 개념과 관련된 문제를 주로 소개하는 동영상 튜토리얼에 대한 관련 지식을 제공합니다. 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다. 추천 학습: mysql 비디오 튜토리얼 데이터베이스 디자인 소개 1. 데이터베이스 디자인 개념 데이터베이스 디자인은 우리가 선택한 DBMS와 결합된 비즈니스 시스템의 특정 요구 사항을 기반으로 합니다. , 본 비즈니스 시스템에 대한 최적의 데이터 저장 모델을 구축합니다. 데이터베이스에서 테이블 구조와 테이블 간 연결을 설정하는 프로세스입니다. 表结构以及表与表之间的关联关系的过程。 有哪些表?表里有哪些字段?表和表之间有什么关系? 2.数据库设计步骤 需求分析:数据库是什么?数据具体有哪些属性?数据与属性的特点是什么? 逻辑分析:通过ER图对数据库进行逻辑建模,不需要考虑我们所选用的数据库管理系统。 物理设计:根据数据库自身的特点把逻辑设计转换为物理设计。 维护设计:对新的需求进行建表和对表的优化。 3.表关系简介 在真实的开发中,一个项目中的数据,一般都会保存在同一个数据库中,但是不同的数据需要保存在不同的数据表中。这时不能把所有的数据都保存在同一张表中。 那么在设计保存数据的数据表时,我们就要根据具体的数据进行分析,然后把同一类数据保存在同一张表中,不同的数据进行分表处理。 数据之间必然会有一定的联系,我们把不同的数据保存在不同的数据表中之后,同时还要在数据表中维护这些数据之间的关系。这时就会导致表和表之间必然会有一定的联系。这时要求设计表的人员,就需要考虑不同表之间的具体关系。 在数据库中,表总共存在三种关系,真实的数据表之间的关系:多对多关系、一对多(多对一)、一对一(极少),(一对一关系就是我们之前学习的Map集合的key-value关系) 表关系(多对多) 1.多对多 如:订单 和 商品 一个商品对应多个订单,一个订单对应多个商品 实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键说明:如果两张表是多对多的关系,需要创建第三张表,并在第三张表中增加两列,引入其他两张表的主键作为自己的外键。 2.外键约束 外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性(例如上述多对多中的订单商品表来维护订单表和商品表之间的关系) 使用之间表的目的是维护两表之间多对多的关系:中间表插入的数据,必须在多对多的主表中存在,如果主表的记录在中间表中维护了关系,就不能随意的删除。如果要删除,必须先要删除中间表关联的数据 3.外键约束语法 -- 关键字解释:constraint: 添加约束,可以不写foreign key(当前表中的列名): 将某个字段作为外键references 被引用表名(被引用表的列名) : 外键引用主表的主键-- 创建表时添加外键约束CREATE TABLE 表名( 列名 数据类型, … [CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名) ); -- 建完表后添加外键约束ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);-- 删除约束ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;로그인 후 복사 4.创建外键约束 -- 订单表CREATE TABLE tb_orders( id int primary key auto_increment, payment double(10, 2), payment_type TINYINT, -- 0 微信支付 1 支付宝支付 status TINYINT -- 0 未付款 1 已经支付);-- 商品表CREATE TABLE tb_goods( id int primary key auto_increment, title varchar(100), price double(10, 2));-- 订单商品中间表CREATE TABLE tb_order_goods( id int primary key auto_increment, order_id int, -- 外键,来自于订单表的主键 goods_id int, -- 外键,来自于商品表的主键 count int, -- 购买商品数量 foreign key(order_id) references tb_orders(id), foreign key(goods_id) references tb_goods(id));로그인 후 복사 5.外键级联 在修改和删除主表的主键时,同时更新或删除从表的外键值,称为级联操作 ON UPDATE CASCADE – 级联更新,主键发生更新时,外键也会更新 ON DELETE CASCADE어떤 시계가 있나요? 테이블에는 어떤 필드가 있나요? 테이블 간의 관계는 무엇입니까? 2. 데이터베이스 설계 단계 요구사항 분석: 데이터베이스란 무엇인가요? 데이터에는 어떤 구체적인 속성이 있습니까? 데이터와 속성의 특징은 무엇입니까? 논리적 분석: 우리가 선택한 데이터베이스 관리 시스템을 고려하지 않고 ER 다이어그램을 통해 데이터베이스를 논리적으로 모델링합니다. 물리적 디자인: 데이터베이스 자체의 특성에 따라 논리적 디자인을 물리적 디자인으로 변환합니다. 유지 관리 설계: 새로운 요구 사항에 따라 테이블을 만들고 최적화합니다. 3. 테이블 관계 소개 실제 개발에서는 일반적으로 프로젝트의 데이터가 동일한 데이터베이스에 저장되지만, 다른 데이터는 다른 데이터 테이블에 저장되어야 합니다. 이때 모든 데이터를 동일한 테이블에 저장할 수 없습니다. 🎜🎜 그리고 데이터를 저장하기 위한 데이터 테이블을 설계할 때에는 특정 데이터를 기준으로 분석한 후, 동일한 유형의 데이터를 동일한 테이블에 저장하고, 서로 다른 데이터를 별도의 테이블로 처리해야 합니다. 🎜🎜🎜🎜데이터 사이에는 일정한 관계가 있어야 합니다. 서로 다른 데이터 테이블에 서로 다른 데이터를 저장한 후에도 데이터 테이블에서 이러한 데이터 간의 관계를 유지해야 합니다. 이는 테이블 간의 특정 연결로 이어질 것입니다. 이때 테이블을 디자인하는 사람들은 서로 다른 테이블 간의 구체적인 관계를 고려해야 합니다. 🎜🎜🎜🎜데이터베이스에는 테이블 간의 관계가 총 3개 있습니다. 실제 데이터 테이블 간의 관계는 🎜다대다 관계, 일대다(다대다)입니다. 일)🎜, 일대일(드물게), (일대일 관계는 앞서 배운 Map 컬렉션의 키-값 관계입니다)🎜🎜테이블 관계(다대다)🎜🎜🎜1. 다대다🎜🎜🎜🎜예: 주문 및 제품🎜 🎜하나의 제품은 여러 주문에 해당하고 하나의 주문은 여러 제품에 해당🎜🎜구현 방법: 세 번째 중간 테이블을 생성합니다. 각각 두 개의 외래 키를 포함하며 두 개의 기본 키 연결🎜참고: 두 테이블이 다대다 관계에 있는 경우 세 번째 테이블을 만들어야 합니다. 세 번째 테이블에 두 개의 열을 추가하고 다른 두 테이블의 기본 키를 자신의 외래 키로 도입합니다. 🎜🎜🎜🎜🎜2. 외래 키 제약 조건🎜🎜🎜🎜외래 키는 두 테이블의 데이터 간 링크를 설정하여 데이터의 일관성과 무결성을 보장하는 데 사용됩니다(예: 다대다 테이블의 주문 제품 테이블). 주문 테이블과 상품 테이블의 관계를 유지하기 위해 위의 다수) 🎜🎜간 테이블을 사용하는 목적은 두 테이블 간의 다대다 관계를 유지하는 것입니다. 🎜중간 테이블에 삽입된 데이터는 다음 테이블에 있어야 합니다. 다대다 메인 테이블 🎜, 🎜 메인 테이블의 레코드가 중간 테이블에서 관계를 유지한다면 임의로 삭제할 수 없습니다. 삭제하려면 먼저 중간 테이블과 연결된 데이터를 삭제해야 합니다🎜🎜🎜🎜🎜3. 외래 키 제약 조건 구문🎜🎜-- 价格create table price( id int primary key auto_increment, price double);-- 水果 create table fruit( id int primary key auto_increment, name varchar(20) not null, price_id int, foreign key (price_id) references price (id));-- 数据insert into pricevalues (1, 2.30);insert into pricevalues (2, 3.50);insert into pricevalues (4, null);insert into fruitvalues (1, '苹果', 1);insert into fruitvalues (2, '橘子', 2);insert into fruitvalues (3, '香蕉', null);로그인 후 복사로그인 후 복사🎜🎜4. 외래 키 제약 조건 만들기🎜🎜-- 多表查询语法(同时查询多个表获取到需要的数据)select * from 表名1,表名2;-- 查询价格(我们向查询水果对应的价格,需要将水果表和价格表同时进行查询;)select * from fruit,price;로그인 후 복사로그인 후 복사🎜🎜5. 외래 키 캐스케이드🎜🎜🎜 수정 중 기본 테이블의 기본 키를 삭제할 때 보조 테이블의 외래 키 값을 동시에 업데이트하거나 삭제하는 것을 캐스케이드 작업이라고 합니다.🎜🎜🎜ON UPDATE CASCADE - 캐스케이드 업데이트, 기본 키가 업데이트되면 외래 키도 업데이트됩니다🎜🎜ON DELETE CASCADE - 캐스케이드 삭제, 기본 키가 삭제되면 외래 키도 삭제됩니다🎜🎜🎜 🎜6. 요약🎜🎜🎜🎜1. 키 제약 조건을 인용해야 하는 이유는 무엇입니까? 🎜🎜🎜테이블의 데이터를 유효하고 정확하게 만드세요. 쿼리 효율성을 향상시킵니다. 🎜🎜🎜2. 외래 키 제약 조건 구문을 추가하시겠습니까? 🎜🎜🎜제약 조건 외래 키 제약 조건 이름 외래 키(현재 테이블의 필드 이름)는 기본 테이블(기본 키)을 참조합니다.🎜🎜🎜3. 외래 키 제약 조건과 함께 데이터 운영 시 주의 사항은?🎜🎜🎜데이터 추가에 필요합니다. 먼저 메인 테이블을 추가한 다음 슬레이브 테이블을 추가하세요. 🎜🎜데이터를 삭제하려면 슬레이브 테이블을 먼저 삭제한 후 마스터 테이블을 삭제해야 합니다. 🎜🎜🎜🎜테이블 관계(일대다) 🎜🎜🎜일대다(다대일) 🎜🎜 如:部门表 和 员工表 一个部门对应多个员工,一个员工对应一个部门 实现方式:在多的一方建立外键,指向一的一方的主键 表关系之一对一 一对一 如:用户和 用户信息 一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能 实现方式:在任意一方加入外键,关联另一方主键,并且设置外键为唯一(UNIQUE) 多表查询 准备数据 -- 价格create table price( id int primary key auto_increment, price double);-- 水果 create table fruit( id int primary key auto_increment, name varchar(20) not null, price_id int, foreign key (price_id) references price (id));-- 数据insert into pricevalues (1, 2.30);insert into pricevalues (2, 3.50);insert into pricevalues (4, null);insert into fruitvalues (1, '苹果', 1);insert into fruitvalues (2, '橘子', 2);insert into fruitvalues (3, '香蕉', null);로그인 후 복사로그인 후 복사 笛卡尔积现象 1.什么是笛卡尔积现象 笛卡尔积问题:把多张表放在一起,同时去查询,会得到一个结果,而这结果并不是我们想要的数据,这个结果称为笛卡尔积。 笛卡尔积缺点:查询到的结果冗余了,里面有很多错误的数据,需要过滤。 多表查询语法:select * from 表名1,表名2; 需求:查询两张表中关于水果的信息,要显示水果名称和水果价格 表设计原则:将价格的主键作为水果的外键 -- 多表查询语法(同时查询多个表获取到需要的数据)select * from 表名1,表名2;-- 查询价格(我们向查询水果对应的价格,需要将水果表和价格表同时进行查询;)select * from fruit,price;로그인 후 복사로그인 후 복사 查询结果:2.笛卡尔积产生原因fruit表中的每一条记录,都和price表中的每一条进行匹配连接。所得到的最终结果是:fruit表中的条目数乘以price表中的数据的条目数。 将fruit表的每行记录和price表的每行记录组合的结果就是笛卡尔积 3.如何避免笛卡尔积 解决上述查询的方案:在查询两张表的同时添加条件进行过滤,比如fruit表的id和必须和price表的id相同 -- 条件过滤笛卡尔积select * from fruit,price where fruit.price_id=price.id;로그인 후 복사 内连接查询 1.什么是内连接 内连接查询又称为交集查询,也就是查询只显示满足条件的数据 2.显示内连接 显示内连接:使用INNER JOIN...ON语句,可以省略INNER关键字 -- 语法核心select * from 表名1 inner join 表名2 on 条件;-- 或者select * from 表名1 join 表名2 on 条件;로그인 후 복사 3.隐式内连接 看不到JOIN关键字,条件使用WHERE指定 select 列名,列名,... from 表名1,表名2 where 表名1.列名=表名2.列名;로그인 후 복사 4.示例 查询水果的价格 -- 隐式内连接select * from fruit,price where fruit.price_id=price.id;-- 显式内连接select * from fruit inner join price on fruit.price_id=price.id;로그인 후 복사 查询苹果的信息,显示苹果的id,名字,价格 -- 方式1select fruit.id, fruit.name, price.pricefrom fruit, pricewhere fruit.price_id = price.id and fruit.name = '苹果';-- 方式2select fruit.id, fruit.name, price.pricefrom fruit inner join price on fruit.price_id = price.id and fruit.name = '苹果';로그인 후 복사 5.总结 1.内连接作用? 过滤笛卡尔积 获取两表的交集部分(都满足条件的部分) 2.什么是隐式内连接和显示内连接? 隐式内连接:看不到JOIN:select 列名,列名....from 表名1,表名2 where 表名1.列名=表名2.列名; 显示内连接:看得到JOIN:select * from 表名1 inner join 表名2 on 条件; 3.内连接查询步骤? 1)确定查询几张表 2)确定表连接条件 3)根据需要在操作 外连接查询 1.左外连接 左表的记录全部显示出来 外表只会显示符合搜索条件的记录 语法格式: select * from 表1 left [outer] join 表2 on 条件;로그인 후 복사 说明: left关键字左边的表定义为左表,left关键字右边的表定义为右表,查询的内容以左表为主 如果左表有数据,而右表没有数据对应的数据,仍然会把左表数据进行显示 outer关键字可以省略 练习: 不管能否查到水果对应价格,都要把水果显示出来 -- 左外连接查询select * from fruit left outer join price on fruit.price_id=price.id;로그인 후 복사 2.右外连接 右表的记录全部表示出来 左表只会显示符合搜索条件的记录 语法格式: select * from 表名1 right [outer] join 表名2 on 条件;로그인 후 복사 说明: right关键字左边的表定义为左表,right关键字右边的表定义为右表,查询的内容以右表为主 如果右表没有数据,而左表没有对应的数据,仍然会把右表数据进行显示 outer关键字可以省略 练习: 不管能否查到价格对应的水果,都要把价格显示出来 select * from fruit right outer join price on fruit.price_id=price.id;로그인 후 복사 总结: 1.掌握左外连接查询格式? select * from 表1 left outer join 表2 on 条件; 表1看作为左表,表2看做为右表 2.左外连接查询特点? 在满足要求的基础上保证左表的数据全部显示 3.掌握右外连接查询格式? select * from 表1 right outer join 表2 on 条件; 4.右外连接查询特点? 在满足要求的基础上,保证右表的数据全部显示 嵌套查询(子查询) 1.什么是子查询 一条查询语句结果作为另一条查询语法一部分。 SELECT 查询字段 FROM 表 WHERE 条件;举例:SELECT * FROM employee WHERE salary=(SELECT MAX(salary) FROM employee);로그인 후 복사 说明:子查询需要放在()中 三种子查询情况:单行单列、多行单列、多行多列。 2.单行单列 子查询结果是单列,在WHERE后面作为条件 SELECT 查询字段 FROM 表 WHERE 字段=(子查询);로그인 후 복사 通常使用比较运算符: > 、>= 、、、=等 3.多行单列 子查询结果是多行单列,结果集类似于一个数组,在WHERE后面作为条件,父查询使用IN运算符 -- IN表示在数值中SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);로그인 후 복사 4.多行多列 子查询结果是多列,在FROM后面作为表 SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;로그인 후 복사 注意:子查询作为表需要取别名,使用as,可以省略,否则这张表没用名称无法访问表中的字段 事务操作 事务的概念 什么是事务 在实际的业务开发中,有些业务操作要多次访问数据库。一个业务要发送多条SQL语句给数据库执行。需要将多次访问数据库的操作视为一个整体来执行,要么所有的SQL语句全部执行成功。如果其中有一条SQL语句失败,就进行事务的回滚,所有的SQL语句全部执行失败。 简而言之,事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败。 事务作用:保证在一个事务中多次操作数据库表中数据时,要么全都成功,要么全都失败。 事务的应用场景声明 关于事务在实际中的应用场景: 假设我在淘宝买了一部手机,然后当我付完款,钱已经从我的账户中扣除。正当此时,淘宝转账系统宕机了,那么此时淘宝还没有收到钱,而我的账户的钱已经减少了,这样就会导致我作为买家钱已经付过,而卖家还没有收到钱,他们不会发货物给我。这样做显然是不合理。实际生活中是如果淘宝出问题,作为用户的账户中钱是不应该减少的。这样用户就不会损失钱。 还有种情况,就是当我付完款之后,卖家看到我付款成功,然后直接发货了,我如果有权限操作,我可以撤销,这样就会导致我的钱没有减少,但是卖家已经发货,同样这种问题在实际生活中也是不允许出现的。 MySQL中可以有两种方式进行事务的操作: 手动提交事物:先开启,在提交 自动提交事物(默认的):即执行一条sql语句提交一次事物 数据准备 # 创建账号表create table account( id int primary key auto_increment, name varchar(20), money double);# 初始化数据insert into account values (null,'a',1000);insert into account values (null,'b',1000);로그인 후 복사 手动提交事务 手动提交事务有关的sql语句 SQL语句 描述 start transaction 开启手动控制事物 commit 提交事物 rollback 回滚事物 手动提交事务使用步骤 开启事务–>执行SQL语句–>成功–>提交事务 开启事务–>执行SQL语句–>失败–>回滚事务 演示案例:演示提交事务,a给b转账100元 -- 1.开启事务start transaction;-- 2.执行sql语句update account set money=money-100 where name='a';update account set money=money+100 where name='b';-- 3.提交事务commit;로그인 후 복사 案例演示:演示回滚事务,a给b转账100元 -- 1.开启事务start transaction;-- 2.执行sql语句update account set money=money-100 where name='a';update account set money=money+100 where name='b';-- 3.回滚事务rollback;로그인 후 복사 注意: 提交事务(commit) :事务提交之后,sql语句对数据库产生的操作才会被永久的保存 事务的回滚(rollback):撤销已经成功执行的sql语句,回到开启事务之前的状态 只要提交事务,那么数据就会长久保存了,就不能回滚事务了。即提交或者回滚事务都是代表结束当前事务的操作 自动提交事务 MySQL的每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,执行完毕自动提交事务,MySQL默认开始自动提交事务。自动提交,通过修改mysql全局变量autocommit进行控制。 通过以下命令可以查看当前autocommit模式 show variables like '%commit%';로그인 후 복사 设置自动提交的参数为OFF set autocommit = 0; -- 0:OFF 1:ON로그인 후 복사 案例演示 -- 自动提交事务:每条sql语句就是一个事务,那么执行一条sql语句就会提交一次事务-- mysql数据库就是自动提交事务-- a给b转账100元update account set money=money-100 where name='a';update account set money=money+100 where name='b';-- 查看mysql是否自动提交事务-- autocommit的值是on表示自动提交事务,值是off表示关闭自动提交事务show variables like '%commit%';-- 我们可以使用命令临时设置mysql变为手动提交事务,即将自动提交事务关闭-- 下次重新连接mysql依然是自动提交事务set autocommit = 0; -- 0 表示关闭自动提交事务 1表示开启自动事务update account set money=money-100 where name='a'로그인 후 복사 注意: 1)MySql默认自动提交。即执行一条sql语句提交一次事务。 2)设置autocommit为off状态,只是临时性的,下次重新连接mysql,autocommit依然变为on状态。 3)如果设置autocommit为off状态,那么当我们执行一条sql语句,就不会自动提交事务,重新启动可视化工具,数据并没有改变。 4)如果设置autocommit为on状态,如果我们先执行start transaction 然后在执行修改数据库的语句: update account set money = money-100 where name='a'; update account set money = money+100 where name='b';로그인 후 복사 那么此时就表示上述修改数据库的sql语句都在同一个事务中,此时必须手动提交事务,即commit; 换句话说,如果我们手动开启事务start transaction那么此时mysql就不会自动提交事务,必须手动提交事务。 5)如果设置autocommit为on状态,如果我们不执行start transaction 直接执行修改数据库的语句: update account set money = money-100 where name='a';update account set money = money+100 where name='b';로그인 후 복사 那么此时mysql就会自动提交事务,即上述每条sql语句就是一个事务 事务原理和四大特征 事务原理 原理说明 一个用户登录成功以后,服务器会创建一个临时日志文件。日志文件用来保存用户事务状态。 如果没有使用事务,则所有的操作直接写到数据库中,不会使用日志文件。 如果开启事务,将所有的写操作写到日志文件中。 如果这时用户提交了事务,则将日志文件中所有的操作写到数据库中。 如果用户回滚事务,则日志文件会被清空,不会影响到数据库的操作。 事务的四大特征 事务的四大特征(ACID) 数据库的事务必须具备ACID特征,ACID是指Atomicity(原子性)、Consistensy(一致性)、Isolation(隔离性)和Durabiliyt(持久性) 隔离性(Isolation) 多个用户并发的访问数据库时,一个用户的事务不能被其他用户的事物干扰,多个并发的事务之间相互隔离持久性(Durability) 트랜잭션이 제출되면 데이터베이스에 대한 변경 사항은 데이터베이스에서 예외가 발생하더라도 다시 시작한 후에도 데이터가 계속 유지됩니다.원자성(Atomicity) 은 SQL 집합을 나타냅니다. 트랜잭션에 의해 패키지된 명령문(비즈니스 로직 세트)은 분할할 수 없는 작업 단위입니다. 트랜잭션의 모든 작업이 발생하거나 전혀 발생하지 않습니다. 일관성 일관성은 데이터가 의미상 의미 있고 올바른 상태에 있음을 의미합니다. 트랜잭션 일관성은 트랜잭션 실행의 결과로 데이터가 한 일관성 상태에서 다른 일관성 상태로 변경되어야 함을 의미합니다. 거래의 성공과 실패, 데이터베이스의 최종 데이터는 실제 비즈니스 논리와 일치합니다. 일관성은 비즈니스 로직 및 원자성에 크게 의존합니다트랜잭션의 동시 액세스로 인해 발생하는 세 가지 질문(인터뷰)작업 중 트랜잭션의 이상적인 상태: 격리된 경우 여러 트랜잭션이 서로 영향을 미치지 않습니다. 부적절한 수준 설정으로 인해 동시 발생이 발생할 수 있습니다. 액세스 문제 동시 액세스 문제meaning dirty reading트랜잭션이 다른 트랜잭션에서 커밋되지 않은 데이터를 읽습니다. 가장 심각한 것은 그러한 일이 발생하지 않도록 방지하는 것입니다. 반복 불가능한 읽기 한 트랜잭션에서 데이터 내용 을 두 번 읽는 것은 일관성이 없습니다. 필요한 것은 트랜잭션에서 여러 번 읽을 때 데이터가 일관성이 없다는 것입니다. 이는 트랜잭션 업데이트로 인해 발생하는 문제입니다. 팬텀 판독(가상 판독) 한 트랜잭션에서 다른 트랜잭션에 의해 삽입되거나 삭제된 데이터를 읽게 되므로 전후에 읽은 레코드 행 수가 달라집니다. insert or delete 때 발생하는 문제입니다. 1. Dirty Read: 한 트랜잭션이 다른 트랜잭션에서 커밋되지 않은 데이터를 읽는 것을 말합니다. (매우 위험함)2. 반복 불가능 읽기: 트랜잭션 내에서 테이블의 데이터를 여러 번 읽으면 여러 번 읽은 결과가 달라집니다. 3. 가상 읽기(가상 읽기): 트랜잭션이 다른 트랜잭션에 의해 삽입되거나 삭제된 데이터를 읽어서 그 전후에 읽은 레코드 행 수가 달라집니다. 4. 잘못된 읽기: 한 트랜잭션이 다른 트랜잭션에서 아직 제출하지 않은 데이터를 읽는 경우는 피해야 합니다. 반복 불가능 읽기: 트랜잭션은 주로 업데이트 문과 같은 다양한 데이터 내용으로 여러 번 읽습니다. 거래가 제출되었습니다. 그런 일이 일어날 수 있습니다. 팬텀 읽기(가상 읽기): 트랜잭션은 주로 삭제 또는 삽입 문을 다른 숫자로 여러 번 읽습니다. 거래가 제출되었습니다. 그런 일이 일어날 수 있습니다. 트랜잭션 격리 수준 위의 문제 시연을 통해 트랜잭션 격리를 고려하지 않으면 더티 읽기, 반복 불가능 읽기, 가상 읽기 등의 문제가 발생한다는 사실을 발견했습니다. 따라서 우리는 데이터베이스에서 위의 세 가지 문제를 해결해야 합니다. MySQL 데이터베이스 사양은 두 트랜잭션이 동시에 발생하는 모든 상황을 설명하는 데 사용되는 4가지 격리 수준을 규정합니다. 사물 격리 수준 위 수준이 가장 낮고 아래 수준이 가장 높습니다. 이 문제가 발생하지 않음을 나타냅니다. level是表示会出现这种问题,否name 격리 수준dirty read반복 불가능한 읽기phantom read데이터베이스 기본 격리 수준 1 커밋되지 않은 읽기 커밋되지 않은 읽기 예예예 2 읽기 커밋 읽기 커밋 아니요예예Oracle 및 SQL Server 3다시 읽을 수 있음 반복 읽기 가능 no noyesyes mysql 4serializable nonono 보안 및 성능 비교 보안: 직렬화>반복 읽기>커밋된 읽기>커밋되지 않은 읽기 성능: 직렬화 실제로 그 중에는 세 가지 문제 중 가장 심각한 문제는 더티 읽기(잘못된 데이터 읽기)입니다. 이 문제는 피해야 합니다. 반복 불가능한 읽기 및 가상 읽기의 경우 실제로 논리적 오류는 없지만 적시성에 문제가 있습니다. 데이터이므로 이런 종류의 문제는 그다지 심각한 오류는 아닙니다. 데이터의 적시성 요구 사항이 그다지 높지 않으면 반복 읽기 및 가상 읽기가 발생하는 경우 허용됩니다. 추천 학습: mysql 비디오 튜토리얼