MS---数据库概念回顾

 数据库事物隔离级别

这个想必每个程序员都很早就知道了,但是我其实并没有真正搞清楚。网络上的很多文章也没说清楚。以下内容个人觉得还是比较好理解的:

 

事务隔离级别(transaction isolation levels ):隔离级别就是对对事务并发控制的等级。ANSI / ISO SQL 将其分为串行化(SERIALIZABLE)、可重复读(REPEATABLE READ)、读已提交(READ COMMITED)、读未提交(READ UNCOMMITED)四个等级。为了实现隔离级别通常数据库采用锁(Lock)。一般在编程的时候只需要设置隔离等级,至于具体采用什么锁则由数据库来设置。首先介绍四种等级,然后举例解释后面三个等级(可重复读、读已提交、读未提交)中会出现的并发问题。

串行化(SERIALIZABLE):所有事务都一个接一个地串行执行,这样可以避免幻读(phantom reads)。对于基于锁来实现并发控制的数据库来说,串行化要求在执行范围查询(如选取年龄在10到30之间的用户)的时候,需要获取范围锁(range lock)。如果不是基于锁实现并发控制的数据库,则检查到有违反串行操作的事务时,需要滚回该事务。

可重复读(REPEATABLE READ):所有被Select获取的数据都不能被修改,这样就可以避免一个事务前后读取数据不一致的情况。但是却没有办法控制幻读,因为这个时候其他事务不能更改所选的数据,但是可以增加数据,因为前一个事务没有范围锁。

读已提交(READ COMMITED):被读取的数据可以被其他事务修改。这样就可能导致不可重复读。也就是说,事务的读取数据的时候获取读锁,但是读完之后立即释放(不需要等到事务结束),而写锁则是事务提交之后才释放。释放读锁之后,就可能被其他事物修改数据。该等级也是SQL Server默认的隔离等级。

读未提交(READ UNCOMMITED):这是最低的隔离等级,允许其他事务看到没有提交的数据。这种等级会导致脏读(Dirty Read)。

 

综上述,可以等到下面的表格:

 

隔离等级

脏读

不可重复读

幻读

读未提交

YES

YES

YES

读已提交

NO

YES

YES

可重复读

NO

NO

YES

串行化

NO

NO

NO

 

注:事物隔离级别是依据一个事物进行查询(Select,可能是一次或多次)时的数据是否“正确”为依据而定义的。(理解)

补充:

1、脏读:事物一读到了事物二尚未提交的数据(如果事物二失败回滚的情况下,则事物一读到的数据则是无效的,或者说垃圾)

              产生级别:读未提交

              解决需要级别: 读已提交

 

2、不可重复读:事物一在二次或多次读取数据时,读到了不同的数据。原因是事物二在中间修改了其中的数据。

              产生级别:读已提交

              解决需要级别: 可重复读

3、幻读: 事物一修改了部分数据,事物二添加了新的并且符合事物一的条件的数据。造成事物一发现有新的数据没有修改,称幻觉。

              产生级别: 可重复读

              解决需要级别:串行化

 

各大数据库默认隔离级别:

Oracle:Read Committed

SQL Server:Read Committed

MySql:( InnoDB )  Repeatable Read

二  高级基础知识理论

1.触发器的作用?

  答:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

 

2。什么是存储过程?用什么来调用?

答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。

 

3。索引的作用?和它的优点缺点是什么?

答:索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

 

3。什么是内存泄漏?

答:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。

4。维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?

答:我是这样做的,尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。

5。什么是事务?什么是锁?

答:事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。

  锁:在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。

6。什么叫视图?游标是什么?

答:视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

  游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

7 NULL是什么意思?

NULL(空)这个值是数据库世界里一个非常难缠的东西,所以有不少应聘者会在这个问题上跌跟头您也不要觉得意外。 NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。假设您的SQL Server数据库里有ANSI_NULLS,当然在默认情况下会有,对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个 UNKNOWN值进行比较,并在逻辑上希望获得一个答案。您必须使用IS NULL操作符

三   SQL语句简介(DQL,DDL,DML,DCL,TCL)

1.数据查询语句(data query language) DQL

这是数据库操作中最常用、最重要的一类。这类语句的作用就是将数据库中数据按自己的需求,有条理的整理出来,包含select语句
常用的技巧还包括:SQL中在select语句中使用算术运算符
在select语句中使用连接字符串
SQL中为select语句中增加别名(Alias)
在select语句中增加提示型文字
使用like关键字
使用转义字符(换码符)
使用distinct关键字来压缩SQL语句中的select查询结果
使用in关键字来选择SQL语句中的select查询结果

2.数据定义语句(data define language) DDL

这类语句是用来建立数据库基本组件的,例如建立表,建立视图等等。包含create语句、drop语句、alter语句。           

3.数据操作语句(data manipulate language)DML

这类语句的作用是根据需要写入、删除、更新数据库中的数据。主要包括Insert语句,delete语句,update语

4.数据控制语句(data control language)DCL

这类语句主要用来实现用户的权限授予或者取消,保证数据的安全性。主要包括(

如Grant(授权)语句、Revoke(撤消)语句、Deny(拒绝)语句

 5.事物控制语句(Transaction control language)TCL

这类语句主要是用来控制事物的动作。主要包含commit语句,rollback语句,setpoint语句

 



参考文献:http://blog.youkuaiyun.com/willfcareer/article/details/5820821

<think>嗯,用户现在询问的是"Per-Port Queue Depth"(每端口队列深度)的概念及其在网络或存储系统中的作用。这个问题涉及到网络设备和存储系统的底层工作机制,需要从技术原理和应用场景两个维度展开解释。 回顾对话历史,用户之前询问过Airties SDK的技术细节,显示出对网络优化技术的深度兴趣。而这次的问题更偏向基础设施层面,说明用户可能在研究网络性能优化或存储系统调优。引用中提到的S3存储、进程参数和内核模块等内容虽然不直接相关,但暗示用户可能接触到底层系统配置。 对于Per-Port Queue Depth这个概念,需要先明确其物理含义:它本质上是指网络端口或存储控制器为待处理数据包分配的缓冲区大小。这个数值直接影响着设备应对突发流量的能力。当流量突然激增时,足够的队列深度可以像"蓄水池"一样暂存数据包,避免因瞬时过载导致丢包。 在网络设备中,队列深度设置需要权衡延迟和吞吐量。过浅的队列会导致高丢包率,过深则可能增加传输延迟(根据Little's Law,队列深度与延迟成正比)。在存储系统(如SAN交换机)里,这个参数还关系到IOPS性能,特别是处理随机读写时,足够的队列深度能维持磁盘利用率。 用户可能真正关心的是如何优化这个参数。这需要结合具体场景:比如在RDMA网络中通常需要浅队列以保持低延迟,而视频流服务器则需要深队列吸收突发流量。建议后续补充说明不同应用场景的配置策略,以及如何通过监控队列使用率(如netstat/sar工具)来动态调整。</think>### Per-Port Queue Depth 概念解析 **Per-Port Queue Depth**(每端口队列深度)指网络设备(如交换机、路由器)或存储系统(如SAN交换机)中**单个物理端口可缓存的未处理数据包/帧的最大数量**[^1]。其本质是流量控制的缓冲区机制,用于应对瞬时流量突发(burst)与传输速率不匹配问题。 --- ### 核心作用与数学原理 #### 1. **流量整形(Traffic Shaping)** 当端口接收速率 $R_{in}$ 短暂超过发送速率 $R_{out}$ 时,队列作为临时缓冲区: $$ \text{队列积压量} = \int (R_{in} - R_{out}) dt \leq Q_{depth} $$ 若积分值超过 $Q_{depth}$(队列深度),则触发**尾部丢弃(Tail Drop)** 或 **主动队列管理(AQM)** 如 RED[^2]。 #### 2. **延迟与吞吐量权衡** 根据 **Little's Law**: $$ \text{平均延迟} = \frac{\text{队列深度}}{\text{吞吐量}} $$ - **深队列** → 高吞吐但高延迟(适合存储系统) - **浅队列** → 低延迟但易丢包(适合实时音视频) #### 3. **拥塞避免** 在 TCP/IP 网络中,队列深度直接影响 **TCP 拥塞窗口**: - 队列溢出导致丢包 → TCP 触发慢启动 - 合理 $Q_{depth}$ ≥ **带宽延迟积(BDP)** 可避免非必要丢包 --- ### 不同场景下的应用 | **系统类型** | 典型队列深度设置 | 作用目标 | |--------------------|-----------------------------|----------------------------------| | **数据中心交换机** | 128~1024 packets/port | 应对微突发流量,保障 RoCEv2/RDMA 低延迟 | | **企业路由器** | 64~256 packets/port | 平衡 VoIP 延迟与普通数据吞吐量 | | **光纤通道 SAN** | 512~4096 frames/port | 吸收磁盘 I/O 突发,维持高 IOPS | | **5G 基站** | 32~128 packets/port | 确保 URLLC 业务超低延迟(<1ms) | --- ### 配置实践与优化 #### 关键参数关联 ```mermaid graph TD A[Per-Port Queue Depth] --> B{影响} B --> C[丢包率] B --> D[端到端延迟] B --> E[吞吐量] C --> F[TCP重传率] D --> G[实时业务QoS] E --> H[链路利用率] ``` #### 调优准则 1. **计算 BDP**: $$ \text{BDP (Bytes)} = \text{带宽 (bps)} \times \text{RTT (秒)} $$ 设 $Q_{depth}$ ≥ BDP / 数据包大小(如 1500B) 2. **业务优先级分层**: - 为关键业务(如 iSCSI)分配**独占队列**(如 DCB 协议) - 启用 **WRED**(加权随机早期检测)避免全局同步丢包[^3] 3. **硬件约束检查**: - 通过 `ethtool -g eth0` 查看网卡最大队列深度 - 存储交换机使用 `scli --portqos -list` 验证配置 --- ### 典型问题与解决方案 | 问题现象 | 队列深度关联 | 修正方案 | |--------------------------|---------------------------|----------------------------------| | 视频卡顿但带宽充足 | 队列过浅导致突发丢包 | 增加 $Q_{depth}$ + 启用 PFC 流控 | | 数据库查询延迟波动 | 存储端口队列溢出触发 SCSI 重试 | 扩展 FC 端口缓冲至 2048 帧以上 | | TCP 吞吐量低于理论值 | $Q_{depth} \ll \text{BDP}$ | 动态调整深度为 BDP 的 2~3 倍 | > ⚠️ **注意**:过度增加队列深度会导致**缓冲区膨胀(Bufferbloat)**,引发秒级延迟(如家用路由器下载时网页打不开)。现代方案如 **fq_codel** 通过**每流队列管理**规避此问题[^3]。 --- ### 相关问题 1. 如何通过 `ethtool` 命令在 Linux 中调整网卡的每端口队列深度? 2. 在 RDMA 网络中,为什么推荐使用浅队列(Shallow Buffers)? 3. 存储系统中 Per-Port Queue Depth 与 LUN Queue Depth 有何区别? 4. 哪些监控工具可实时检测交换机端口队列使用率(如 SNMP OID)? 5. 如何验证队列深度设置是否与当前网络 RTT 匹配? [^1]: 队列深度本质是数据包缓冲区的容量限制,直接影响流量控制能力 [^2]: 如 `-q` 参数定义监听队列长度,防止连接请求溢出 [^3]: 动态内核参数调整可通过 `/sys/module/` 接口实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值