`
jackyoo8
  • 浏览: 82236 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

多进程多线程访问数据库

    博客分类:
  • php
阅读更多
如何让多进程多线程访问数据库,而不会选择相同的数据,这在设计分布式程序的时候经常用到,多台机器的多个进程,每个进程都有多个线程,每个线程要从数据库里取数据来处理,要实现不能漏取数据,也不能重复取数据,这里给出答案

创建一个数据表,如下,一个自增列,一个表示rss链接地址先放1w条数据再创建一个锁表,一个字段表示是否已经锁定的资源,另一个表示已经读取的rss源的最大id初始化数据下面我们要设计一个存储过程,让这个存储过程每次返回10个 rss源,知道返回所有的rss源,要求无遗漏,无重复返回。如下

1、如果锁表里显示没有进程正在读取rss源(IsLock = 0),那么就返回从最大的rss源id往后的10个rss源,否则返回空。

2、用with(READPAST)表示忽略锁住的行,如果另一个进程正在执行 update Rss_RssSourceLock的语句,并且在事务提交前,update语句会锁住这些要更新的行,而Rss_RssSourceLock表就一行数据,这时候select Rss_RssSourceLock表并且忽略被锁的行肯定是没数据的,所以本次存储过程执行会返回空。

3、begin tran和commit tran保证了即使本次存储过程出错,也不会让Rss_RssSourceLock表处于IsLock = 1的脏数据状态,如果处于这种状态,后面的进程执行存储过程就永远也返回不了数据了。

4、因为有时候一次选取的记录可能不够10条,所以这里用了个临时表来暂存记录,再算出来选取的条数,最后更新Rss_RssSourceLock表的MaxSourceId字段。但用临时表肯定会增加数据库的压力,这里不知道用表变量是不是会改善性能,暂时先这样了。

5、应用里调用这个存储过程,如果返回了数据,就进行处理,如果没返回数据,就sleep几秒才执行,直到返回数据。
CREATE TABLE [dbo].[Rss_RssSources](

[SourceId] [int] IDENTITY(1,1) NOT NULL,

[Link] [varchar](1024) NOT NULL

) ON [PRIMARY]

declare @i int

set @i = 1

while @i <10000

begin

select @i = @i +1

insert into [Rss_RssSources] values(newid())

end

create table Rss_RssSourceLock

(

IsLock bit,

MaxSourceId int

)

insert into Rss_RssSourceLock values (0,0)

CREATE PROCEDURE [dbo].[USP_GetRssSources]

AS

BEGIN

if exists(select * from Rss_RssSourceLock with(READPAST) where IsLock = 0)

begin

declare @select_count int

begin tran

update Rss_RssSourceLock set IsLock = 1

if object_id('tempdb..#t') is not null

drop table #t

select top 10 a.* into #t from [Rss_RssSources] as a

inner join Rss_RssSourceLock as b

on a.SourceId > b.MaxSourceId

order by a.[SourceId]

select @select_count = count(*) from #t

update Rss_RssSourceLock set IsLock = 0,MaxSourceId = MaxSourceId + @select_count

select * from #t

commit tran

end

END 
分享到:
评论

相关推荐

    java多线程处理数据库数据

    1. **线程安全**:由于多线程环境下可能存在数据竞争,所以在访问共享资源(如数据库连接)时,需要确保线程安全。可以使用`synchronized`关键字或者`Lock`来同步访问。 2. **事务管理**:在多线程环境中,可能需要...

    程序进程条 delphi 源码 数据库 多线程

    在"程序进程条 delphi 源码 数据库 多线程"这个主题中,我们可以深入探讨以下几个关键知识点: 1. **程序进程条(Progress Bar)**: - 程序进程条是用户界面设计的重要组成部分,它可以提供实时反馈,让用户了解...

    java 多线程数据库操作

    - **锁与同步**:在多线程环境中,对共享资源(如数据库连接)的访问需要同步控制,防止数据不一致。Java提供了`synchronized`关键字、`Lock`接口等同步机制。 - **异常处理**:多线程环境下,异常处理尤为重要,需...

    多进程写sqlite互斥解决方案代码

    在多进程或多线程环境中,互斥是指同一时间只有一个进程或线程可以访问特定的资源,如数据库。这是通过锁机制实现的,如互斥锁(mutex)。 对于多进程环境,可以使用操作系统的互斥锁,例如在Unix/Linux系统中的`...

    QT中sqlite多线程操作4个注意问题

    在开发基于Qt的应用程序时,经常会遇到需要使用多线程来进行SQLite数据库操作的情况。然而,多线程环境下的数据库操作相较于单线程来说更为复杂,需要特别注意一些细节问题,以确保程序的稳定性和效率。本文将总结在...

    多线程对数据库操作

    多线程是指在一个进程中同时执行多个不同的线程。Java提供了丰富的多线程支持,通过`Thread`类和`Runnable`接口可以创建并运行新线程。在多线程环境中,每个线程可以独立地执行任务,从而提高了程序的并行处理能力。...

    多线程delphi 源码 数据库

    3. **线程安全的数据访问**:当多个线程同时访问数据库时,必须确保所有数据库操作都是线程安全的,防止竞态条件和死锁。 4. **事务管理**:在多线程环境中,正确使用事务可以帮助维护数据的一致性和完整性,特别是...

    sqlite数据库c++类封装,及源码实例,boost多线程

    在SQLite数据库操作中使用多线程,可以提高并发性能,尤其是在处理大量并发请求时。Boost.Thread库提供了`thread`类,可以用来创建和管理线程。为了确保线程安全,我们需要考虑锁机制,如互斥锁(`mutex`)和条件...

    数据库网络通讯,有关数据库的操作、 网络通信以及多线程的使用

    数据库网络通讯是IT领域中的重要组成部分,涉及到数据库的管理和数据的传输,以及多线程技术在并发处理中的应用。在现代软件系统中,数据库作为数据存储的核心,与网络通信和多线程技术相结合,能够实现高效、可靠的...

    java简单分布式架构,多个数据源,线程池多线程访问

    本项目围绕“Java简单分布式架构,多个数据源,线程池多线程访问”这一主题展开,旨在通过利用Java技术栈实现一个高效的分布式系统。 首先,我们关注的是“分布式”这一概念。分布式系统是由多台计算机通过网络连接...

    linux unix下多线程与进程

    2. 数据库系统:并发查询和事务处理通常使用多线程,以提高I/O操作效率。 3. 多媒体播放器:解码、渲染等任务可以分给不同线程,保证流畅播放。 总之,Linux和Unix下的进程和线程是系统级编程的重要概念。理解它们...

    unix多线程/多进程编程

    多进程则常见于大型软件,如数据库系统,每个进程负责一部分工作,通过进程通信协调。 总结,Unix的多线程和多进程编程提供了丰富的并发编程模型,开发者可以根据需求选择合适的方案。理解和熟练掌握线程和进程的...

    JAVA 线程实现数据库的主从同步更新

    在Java编程环境中,...总之,使用Java线程实现数据库主从同步更新是一种常见且实用的技术手段,它涉及到多线程编程、数据库操作、事务管理等多个方面。理解和掌握这些知识点对于开发高可用性的分布式系统至关重要。

    VC多线程操作ORACLE数据库

    多线程是指在一个进程中可以同时执行多个独立的线程,每个线程都有自己的执行序列。在VC++中,我们可以使用Windows API函数如CreateThread或C++标准库中的std::thread来创建和管理线程。这样做的好处在于,可以提高...

    PB多线程实现

    1. **线程安全**:确保共享数据在多线程环境下正确访问,通常需要使用锁(如Monitor或Mutex)、信号量(Semaphore)或原子操作来实现。 2. **线程间通信**:线程间的同步和通信至关重要,可以使用事件(Event)、...

    多线程内存数据库服务器设计

    本文的重点在于通过多线程架构来解决传统多进程体系结构存在的问题,比如资源消耗大、进程调度开销高以及难以实现大容量共享存储。 在MTMDS中,采用了【实时数据库引擎(RDE)】,它运用了“移动平均反馈”事务预测...

    Delphi多线程详解_delphi_delphi多线程_多线程_

    多线程是指在一个进程中创建多个执行线程,每个线程都可以独立地执行任务。在单核CPU系统中,操作系统通过时间片轮转的方式模拟多线程并行执行;而在多核或多处理器系统中,线程可以真正地并行运行,显著提升程序...

    多线程的运用e语言多线程 e多线程

    多线程是操作系统提供的一个特性,它允许多个任务在单个进程中并行执行。在E语言中,多线程能够帮助开发者在处理大量I/O操作、复杂的计算任务或者需要实时交互的应用场景时,提高程序的效率。通过创建多个线程,每个...

    在PB中实现 多线程的例子

    例如,`Mutex`用于在多线程访问同一资源时提供独占访问,确保任何时候只有一个线程可以访问。 ```pb Mutex mutex = Create Mutex mutex.Lock() // 获取锁 // 访问共享资源 mutex.Unlock() // 释放锁 ``` **4. 线程...

Global site tag (gtag.js) - Google Analytics