C# 双检锁机制实现高并发数据库限流控制

Ivy
Ivy
发布时间:2026-10-14| 6人浏览过
原创

在高并发系统中,当缓存层失效时,大量突发请求可能直接冲击数据库。本文解析一种基于 C# 的双重检查锁定机制,通过限制同一时间段内仅有单一请求进入数据库读取逻辑,实现粗粒度的数据库访问限流,防止数据库过载。

背景与目标

假设系统每秒面临千万级查询请求,而数据库单次读取耗时约 1ms。若不加控制,瞬时涌入的请求将导致数据库连接耗尽甚至宕机。我们的目标是将同时访问数据库的请求数限制在极低水平(例如每毫秒仅允许一条记录),其余请求则返回“繁忙”状态或直接丢弃,以保护后端稳定。

核心实现原理

该方案利用一个静态变量 currentValidSessionID 和一个锁对象 databaseDoor 来协调线程行为。

第 1 步:初步过滤

在获取锁之前,首先进行一次非原子判断。如果 currentValidSessionID 不等于 -1(即已有请求正在执行或刚执行完毕未重置),则直接进入后续逻辑拒绝当前请求。这一步旨在拦截绝大多数并发请求,减少锁竞争。

第 2 步:获取锁进行精确控制

对于通过第一步过滤的请求,进入 lock (databaseDoor) 代码块。由于 lock 确保了互斥性,同一时间只有一个线程能执行内部代码,极大降低了并发干扰。

复制代码
lock (databaseDoor)
{
    // now there is only one request can reach below codes.
    if (currentValidSessionID == -1)
    {
        currentValidSessionID = currentRequest.SessionID;
    }
}

在锁内再次检查 currentValidSessionID 是否为初始值。只有首次进入且为初始值的请求才能修改变量,其他排队等待锁的线程在此第二次检查时将发现变量已变更,从而退出临界区。

第 3 步:执行与恢复

成功获取“通行权”后,程序验证会话 ID 是否匹配,并执行核心的数据库读取操作。无论成功与否,在 finally 块中必须将 currentValidSessionID 重置为 -1,以便下一个请求周期能够开始。

复制代码
public static long currentValidSessionID = -1;
public static object databaseDoor = new object();

void readDatabase(Request currentRequest)
{
    // 第一次检查:非阻塞尝试
    if (currentValidSessionID == -1)
    {
        // 第二次检查:在锁内进行,确保安全
        lock (databaseDoor)
        {
            if (currentValidSessionID == -1)
            {   
                currentValidSessionID = currentRequest.SessionID;
            }
        }
    }

    // 最终判断:确认自己是唯一获准执行的请求
    if (currentValidSessionID == currentRequest.SessionID)
    {   
        try
        {
            // 核心数据库操作代码
            // ExecuteDBQuery(currentRequest);
        }
        catch()
        {
            // 异常处理
        }
        finally
        {
            // 执行完毕后重置状态,允许下一轮
            currentValidSessionID = -1;
        }
    }
    // 如果不是匹配的 SessionID,则视为被限流的请求
    else
    {
        // ReturnErrorPage();
    }
}

关键注意事项

  • 性能权衡: 虽然现代 CPU 内存赋值极快,但在极端高并发下,lock 仍可能引起线程上下文切换和等待。此方案适用于对“绝对并发量”有严格上限要求的场景,而非追求极致吞吐量。
  • 状态重置: 务必在 finally 中重置状态,否则一旦执行线程出现异常,系统将永久死锁(所有后续请求都被拒绝)。
  • 安全性说明: 此方案主要解决资源过载问题。对于严格的分布式环境或多实例部署,需结合 Redis 分布式锁等更高级的方案,因为单个进程的静态变量无法跨机器共享。

以上就是 C# 编写的高并发数据库控制访问代码的详细内容,更多关于 C# 并发编程与数据库保护的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。