-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
数据库篇--MySql #9
Comments
9.数据事物的实现原理以InnoDB引擎为例来简单说一下 10.并发事务带来哪些问题?事务并发运行,经常会操作相同的数据来完成各自的任务,可能会导致以下问题: 2.丢失操作(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。例如:事务 1 读取某表中的数据 A=20,事务 2 也读取 A=20,事务 1 修改 A=A-1,事务 2 也修改 A=A-1,最终结果 A=19,事务 1 的修改被丢失。 3.不可重复读(Unrepeatable read): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。 4.幻读(Phantom read):幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。 不可重复读和幻读区别: |
11.事务隔离级别有哪些?SQL便准定义了四个隔离级别: SQL的默认隔离级别是可重复读 细说不可重复读不可重复读主要是指在一个事务内,多次读取同一数据,读出的结果是不一致的。 这是因为在这个事务读取数据的过程中,有其他事务同时修改了这些数据并提交,那么每次读取的数据就可能会不一样。例如,你读取了一个商品的价格,然后另一个事务修改了这个商品的价格并提交,你再次读取这个商品的价格,就会发现价格已经改变,这就是不可重复读。 那么,如何解决不可重复读的问题呢? 数据库采用锁的概念来解决这个问题。在可重复读(Repeatable read)级别,数据库引擎会在读取数据时,对读取的数据加共享锁(也叫读锁)。这样其他事务就无法修改这些数据,只能进行读取,直到当前事务完成(提交或回滚),共享锁才会被释放。 同时,当事务试图修改数据时,也会尝试对数据加排他锁(也叫写锁)。如果这些数据被其他事务的共享锁锁住,那么这个事务就会被阻塞,直到共享锁被释放。 因此,通过锁机制,数据库能够确保在同一事务中,多次读取同一数据会得到一致的结果,从而避免了不可重复读。 不过需要注意,这种机制能够避免不可重复读,但可能无法避免幻读。因为新插入的行并不会被当前事务锁住,所以还是可能会出现幻读的情况。 补充:RR和RC的底层原理,涉及MVCC在RR(Repeatable Read)事务隔离级别下: 1.在事务开始时创建一个快照(snapshot),事务中所有的读操作都会基于这个快照来读取数据,所以在这个事务内,读取的数据是一致的,也就是“可重复读”。这种方式就是“快照读”。 在RC(Read Committed)事务隔离级别下: 1.在每次查询开始时创建一个快照。也就是说,同一事务内,如果多次执行同样的查询,可能会看到不同的结果,因为每次查询都可能会有一个新的快照。这种方式也是一种“快照读”。 补充:幻读和不可重复读的区别,以及解决幻读的机制区别不可重复读"是指在一个事务内,多次读同一数据,由于其他提交的事务所做的更新导致多次读取结果不一致。在MVCC模型下,读操作读取的是快照数据,不会看到其他并发事务对该数据的修改,因此可以避免"不可重复读"。 "幻读"是指在一个事务内,多次查询的结果集不一样。注意和"不可重复读"的区别,**"幻读"是针对的结果集,而不是单个数据。**比如一个事务内两次查询,第一次查询了10条数据,但是第二次查询却变成了11条,这就是幻读。 MVCC可以解决"不可重复读",但不能解决"幻读"。这是因为MVCC解决的是同一行数据的并发修改带来的问题,但对于整个结果集的并发插入或删除,MVCC并不能有效处理。 在实践中,解决"幻读"常常会采用范围锁(比如Next-Key Locks in InnoDB)。这样的锁不仅锁定了查询涉及的索引记录,还锁定了索引范围,防止其他事务在该范围内插入新的记录。当然,这种方式带来的副作用是会降低并发性能。 范围锁范围锁(Next-Key Locks)是InnoDB用于防止幻读的一种锁定机制。它主要的作用是锁定一定范围内的数据,以保证在一个事务执行期间,其他事务不能在这个范围内插入新的数据,从而造成幻读现象。 Next-Key Locks实际上包括两部分:记录锁(Record Lock)和间隙锁(Gap Lock)。 记录锁:锁定索引记录本身。 间隙锁:锁定索引记录之间的“间隙”。这就意味着其他事务不能在这个间隙中插入新的记录。 所以Next-Key Locks就是记录锁和间隙锁的结合。当InnoDB对一条记录进行搜索时,它会在该记录上设置一个记录锁,并在前后两个记录之间设置一个间隙锁。这样,就保证了在这个事务执行期间,其他事务不能在这个范围内插入新的数据,从而避免了幻读。 例如,假设有一个索引的键值是1,3,5,7,9。如果一个事务对键值为5的记录进行查询并加锁,那么InnoDB会在这个记录上加一个记录锁,并且在键值3和5之间以及5和7之间加间隙锁。这样就防止了其他事务在这个范围内插入新的记录。 |
13.SQL部分语法left join Join和innerjoin,Union和unionalJOIN和INNER JOIN实际上是完全相同的。两者都是返回两个表中匹配的行。如果行在一个表中但不在另一个表中,则不返回该行。 而关于UNION和UNION ALL,这两个操作符都用于合并两个或多个SELECT查询的结果,但它们处理重复行的方式不同。 UNION操作符会合并查询结果并删除重复的行。结果集中的每一行都是唯一的。此外,UNION内部会进行排序,这可能会影响性能。 UNION ALL操作符合并查询结果,包括所有重复的行。相比之下,因为不需要进行额外的去重操作,UNION ALL通常会提供更好的性能。 所以简单来说,如果你不想在结果中有重复的行,你应该使用UNION。如果你不介意有重复的行,或者你知道结果集中不可能有重复的行,你应该使用UNION ALL。因为后者的性能更好。 |
1.什么是数据库,数据库管理系统,数据库系统,数据库管理员
数据库:数据库就是信息的集合或者说数据库是由数据库管理系统管理的数据的集合
数据库管理系统:数据库管理系统(DATABASE MaNAGEMENT System 简称 DBMS)是一种操纵和管理数据库的大型软件,通常用于建立、使用和维护数据库
数据库系统:数据库系统(Data Base System, 简称DBS)通常由软件、数据库和数据管理员(DBA)组成。
数据库管理员:数据库管理员,负责去那面管理和控制数据库系统
2.主键和外键有什么区别
主键(主码):主键用于唯一标识一个元组,不能有重复,不允许为空。一个表只能有一个主键。
外键(外码):外键用来和其他表建立联系用,外键是另一表的主键,外键是可以有重复的,可以是控制。一个表可以有多个外键。
3.什么是ER图
ER图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模式。它是描述现实世界关系概念莫ing的优先方法。是表示概念关系模型的一种方式
这是一个学生选课的ER图,每个学生可以选若干门课程,同一门课程也可以被若干人选择,所以它们之间的关系是多对多(M:N),其他也有1:1,1:N
4.关系型数据库和非关系型数据库
1.关系型数据库是使用行和列来确定数据关系的数据库,每一行代表一条记录,每一段代表一个字段。表之间通过主键外键来连接,通常遵循范式,第一范式是保证每列最小化,第二范式是消除部份依赖,第三范式是消除传递依赖(高强度连接主键,似乎和B+树的聚簇索引有关?),来消除数据冗余和提高一致性
2.非关系型数据库更为灵活,不需要预定义数据结构,它的数据结构更像是键值对,JSON文档或者是宽列存储等,这样可以更自由地存储和查询数据。
使用场景:关系型数据库适合存储结构化的、需要进行复杂查询的数据,而非关系型数据库更适合处理大量的非结构化数据,或者需要快速读写的场景。在实际应用中,很多大型系统会同时使用关系型数据库和非关系型数据库,以求在不同的场景中都能发挥出最大的效率。
The text was updated successfully, but these errors were encountered: