c#面试题整理

1.如何保持数据库的完整性,一致性

最好的方法:数据库约束(check,unique,主键,外键,默认,非空)

其次是:用触发器

最后:才是自己些业务逻辑,这个效率低

2.事务

有点类似于存储过程,也是把一大串的sql语句,整合在一起,然后通过commit 调用事务名。

他的优势在于,在于要么全部成功,如果失败的话,会回滚,不会出现一部分成功,一部分失败这种情况。很好地维护了数据库的完整性和一致性。事务有这么几个特性,原子性,一致性,隔离性,持久性

3.介绍一下数据库的锁

锁的类型有三种

共享锁 S Lock

排它锁 X Lock

更新锁 U Lock

X Lock(仅允许一个事务进行读写)

-- 隐式加锁示例

BEGIN TRANSACTION;

-- 对某一行加排他锁(X Lock)

UPDATE Employees

SET Salary = Salary + 1000

WHERE EmployeeID = 1;

-- 提交事务,释放锁

COMMIT TRANSACTION;

执行 UPDATE 时,SQL Server 会自动对 EmployeeID = 1 的行加排他锁(X Lock),直到事务提交或回滚。

S Lock(允许多个事务一起读,但禁止写)

-- 显式加共享锁(S Lock)

BEGIN TRANSACTION;

SELECT *

FROM Employees WITH (HOLDLOCK, ROWLOCK)

WHERE DepartmentID = 10;

-- 提交事务,释放锁

COMMIT TRANSACTION;

  • HOLDLOCK:保持共享锁直到事务结束。

  • ROWLOCK:指定行级锁。

U Lock(初始为共享锁,更新时升级为排它锁)

-- 设置锁超时为 5 秒

SET LOCK_TIMEOUT 5000;

BEGIN TRANSACTION;

-- 尝试加锁,如果 5 秒内未获得锁,则抛出错误

SELECT *

FROM Employees WITH (UPDLOCK, ROWLOCK)

WHERE EmployeeID = 1;

COMMIT TRANSACTION;

  • UPDLOCK:加更新锁(U Lock),防止其他事务修改数据。

BEGIN TRANSACTION;

-- 加更新锁(U Lock)

SELECT *

FROM Employees WITH (UPDLOCK)

WHERE EmployeeID = 1;

-- 检查数据后决定更新

UPDATE Employees

SET Salary = Salary + 1000

WHERE EmployeeID = 1;

COMMIT TRANSACTION;

  • SELECT 语句中,WITH (UPDLOCK) 提示会对 EmployeeID = 1 的行加更新锁(U Lock)。

  • 此时,其他事务可以读取该行(加共享锁),但不能加更新锁或排他锁。

  • 当执行 UPDATE 语句时,更新锁会升级为排他锁(X Lock),其他事务将无法访问该行,直到当前事务完成。

4.介绍一下索引

索引,英文名index,功能就类似于书籍的索引,通过索引目录,可以更快地定位。

5.介绍一下视图和游标

视图是一种虚拟表,有时候为了方便查询,会将一张表或多张的表数据,作个临时的整合。视图的作用,就是把临时整合的结果放在视图里,这样查询这个整合结果的时候,直接查询视图名即可。理论上可以对视图进行增加,删除,修改,但是条件很苛刻,建议从原表进行增删改

游标,顾名思义游动的标记。比如有一张订单表,里面有订单总额这个字段,这时候要实现总额超过1000的,状态字段显示高,小于等于1000的显示低。游标起到的作用,就是遍历查询结果,加上对应的高低状态。

游标的缺点就是服务器开销大。

6.介绍一下存储过程

将一大串的sql语句,整合在一起。exec 调用存储过程名。有点,速度快,流量消耗少,加密性好,防止sql注入

7.触发器介绍一下

triger。对某张表执行某项操作的时候,如果该操作,有对应的触发操作,执行该操作后,就会执行触发器里定义的操作行为。

有点就是:减少了客户端的操作步骤,也算是起到了数据约束的作用

相关推荐
Flying pigs~~9 小时前
RAG智慧问答项目
数据库·人工智能·缓存·微调·知识库·rag
misL NITL9 小时前
mysql之如何获知版本
数据库·mysql
许彰午10 小时前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
2401_8323655211 小时前
JavaScript中rest参数(...args)取代arguments的优势
jvm·数据库·python
2301_7796224111 小时前
Go语言怎么用信号量控制并发_Go语言semaphore信号量教程【入门】
jvm·数据库·python
2301_7662834411 小时前
c++如何将控制台输出保存到文件_cout重定向到txt【详解】
jvm·数据库·python
北极的冰箱11 小时前
MySQL Ver 8.0.41 for macos14.7密码遗忘
数据库·mysql
XDH_CS12 小时前
MySQL 8.0 安装与 MySQL Workbench 使用全流程(超详细教程)
开发语言·数据库·mysql
treacle田12 小时前
达梦数据库-统计信息收集-记录
数据库·达梦数据库统计信息收集
审判长烧鸡13 小时前
PostgreSQL之索引/函数/触发器
数据库·postgresql·触发器·函数·索引