首页 > 编程知识 正文

关系型数据库基础,关系型数据库的概念

时间:2023-05-05 10:08:55 阅读:211250 作者:1303

关系型数据库

1、基于关系代数理论
2、缺点:表结构不直观,实现复杂,速度慢
3、优点:健壮性高,社区庞大。

笛卡尔集结果
一个表查询另一个表的Join数据(不带on和任何条件),查询出的结果就是两个表的乘积,这个结果就称为笛卡尔集。数据库在做内连接语句的时候,它不会去查找笛卡尔集。它会根据你连接的条件去进行查询。

左连接、右连接、内连接,四张图给你讲清楚。

左联接和右连接
表A在左边,表B在右边,这个就是说包含表A中是Null的值也被显示出来,同理,反之就是右连接。

内连接
取它们两者之间的条件一致的数据,说简单点就是取它们的交集

全连接

事务

ACID
原子性(Atomicity)
事务必须是一个自动工作的单元,要么全部执行,要么全部不执行。
一致性(Consistent)
事务结束的时候,所有的内部数据都是正确的。
隔离性(Isolation)
并发多个事务时,各个事务不干涉内部数据,处理的都是另外一个事务处理之前或之后的数据。
持久性(Durability)
事务提交之后,数据是永久性的,不可再回滚。

数据库的隔离级别

脏读:第一个事务读取第二个事务正在更新的数据表,如果第二个事务还没有更新完成,那么第一个事务读取的数据将是一半为更新过的,一半还没更新过的数据,这样的数据毫无意义。
幻读:第一个事务读取一个结果集后,第二个事务,对这个结果集经行增删操作,然而第一个事务中再次对这个结果集进行查询时,数据发现丢失或新增。

Read uncommitted(脏读)
事务中的修改,即使没有提交,其他事务也可以看得到,比如说上面的两步这种现象就叫做脏读,这种隔离级别会引起很多问题,如无必要,不要随便使用

Read Committed (读取提交的值)
只能看到已经完成的事务的结果,正在执行的,是无法被其他事务看到的。这种级别会出现读取旧数据的现象

Repeatable Reads(可重复读)
解决了脏读的问题,该级别保证了每行的记录的结果是一致的,但是却无法解决另一个问题,幻行,顾名思义就是突然蹦出来的行数据。指的就是某个事务在读取某个范围的数据,但是另一个事务又向这个范围的数据去插入数据,导致多次读取的时候,数据的行数不一致。

Serializable(可串行化)
最高的隔离级别,它通过强制事务串行执行(注意是串行),避免了前面的幻读情况,由于他大量加上锁,导致大量的请求超时,因此性能会比较底下,再特别需要数据一致性且并发量不需要那么大的时候才可能考虑这个隔离级别。

悲观锁
悲观锁假定其他用户企图访问或者改变你正在访问、更改的对象的概率是很高的,因此在悲观锁的环境中,在你开始改变此对象之前就将该对象锁住,并且直到你提交了所作的更改之后才释放锁。

乐观锁
与悲观锁相反,乐观锁则认为其他用户企图改变你正在更改的对象的概率是很小的,因此乐观锁直到你准备提交所作的更改时才将对象锁住,axdgtx读取以及改变该对象时并不加锁。

死锁
我们先来提两个疑问:什么是死锁,为什么会产生死锁?先来看看一个例子。
A更新earth,请求earth的排它锁,由于B占用着earth的排它锁,等待。
B更新lives,请求lives的排它锁,由于A占用着lives的排它锁,等待。

向这样相互等待对方释放资源,造成资源读写拥挤堵塞的情况,就被称为死锁现象,也叫做阻塞,当然原因也是如此,解决方法只有牺牲某一方的事务让它回滚,让另一方的事务通行,这样就不至于都堵着了。
那么如何减少死锁的产生呢?
1、按照同一顺序访问数据库资源,上述例子就不会发生死锁啦。
2、保持是事务的简短,尽量不要让一个事务处理过于复杂的读写操作。事务过于复杂,占用资源会增多,处理时间增长,容易与其它事务冲突,提升死锁概率。
3、尽量不要在事务中要求用户响应,比如修改新增数据之后在完成整个事务的提交,这样延长事务占用资源的时间,也会提升死锁概率。
4、尽量减少数据库的并发量。
5、尽可能使用分区表,分区视图,把数据放置在不同的磁盘和文件组中,分散访问保6、存在不同分区的数据,减少因为表中放置锁而造成的其它事务长时间等待。
7、避免占用时间很长并且关系表复杂的数据操作。
8、使用较低的隔离级别,使用较低的隔离级别比使用较高的隔离级别持有共享锁的时间更短。这样就减少了锁争用。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。