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。对某张表执行某项操作的时候,如果该操作,有对应的触发操作,执行该操作后,就会执行触发器里定义的操作行为。

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

相关推荐
言之。9 小时前
Django中的软删除
数据库·django·sqlite
阿里嘎多哈基米10 小时前
SQL 层面行转列
数据库·sql·状态模式·mapper·行转列
抠脚学代码10 小时前
Ubuntu Qt x64平台搭建 arm64 编译套件
数据库·qt·ubuntu
jakeswang10 小时前
全解MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析
数据库·mysql
Heliotrope_Sun11 小时前
Redis
数据库·redis·缓存
一成码农11 小时前
MySQL问题7
数据库·mysql
吃饭最爱11 小时前
JUnit技术的核心和用法
数据库·oracle·sqlserver
专注API从业者11 小时前
Python/Java 代码示例:手把手教程调用 1688 API 获取商品详情实时数据
java·linux·数据库·python
雨落Liy11 小时前
SQL 函数从入门到精通:原理、类型、窗口函数与实战指南
数据库·sql
Kt&Rs12 小时前
MySQL复制技术的发展历程
数据库·mysql