在程序里起了多个数据库连接,并用多个线程执行存储过程,但取出记录出现重复,请问是为什么?

shjqk 2005-03-24 04:14:33
我的程序起了几个数据库连接,并且开了几个线程抢数据库连接来调用存储过程,存储过程的功能是返回一批记录,并把这批记录打上标记,就不会被取出了。现在的现象是
线程1调用了存储过程后取会5条记录如 101,102,103,104,105
但线程2会返回102,103,105,106,107出现不该出现的重复现象
请问这是为什么,该怎么解决?
请教,谢谢!
...全文
110 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shjqk 2005-03-25
  • 打赏
  • 举报
回复
谢谢!还想请教一下线程同步通常通过哪些方法来实现,能举些例子吗?
oyljerry 2005-03-24
  • 打赏
  • 举报
回复
做好线程同步,否则可能读到所谓的脏数据-无效数据或重复数据
legendhui 2005-03-24
  • 打赏
  • 举报
回复
CRITICAL_SECTION g_csA;
CRITICAL_SECTION g_csB;

void main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);

InitializeCriticalSection(&g_csA);
InitializeCriticalSection(&g_csB);
Sleep(4000);

DeleteCriticalSection(&g_csA);
DeleteCriticalSection(&g_csB);
}

DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
)
{
while(TRUE)
{
EnterCriticalSection(&g_csA);
Sleep(1);
EnterCriticalSection(&g_csB);
if(tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
}
else
break;
LeaveCriticalSection(&g_csB);
LeaveCriticalSection(&g_csA);
}

return 0;
}

DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
)
{

while(TRUE)
{
EnterCriticalSection(&g_csB);
Sleep(1);
EnterCriticalSection(&g_csA);
if(tickets>0)
{
Sleep(1);
cout<<"thread2 sell ticket : "<<tickets--<<endl;
}
else
break;
LeaveCriticalSection(&g_csA);
LeaveCriticalSection(&g_csB);
}
cout<<"thread2 is running!"<<endl;
return 0;
}
shjqk 2005-03-24
  • 打赏
  • 举报
回复
不是很了解CRITICAL_SECTION和共享内存,能不能举个例子说明一下
谢谢!
xjtuzhw 2005-03-24
  • 打赏
  • 举报
回复
做个线程间的通信或者共享内存好了
shjqk 2005-03-24
  • 打赏
  • 举报
回复
我是同样的线程,WinThread开了5个
modena 2005-03-24
  • 打赏
  • 举报
回复
另外比如SQLSERVER数据库自身带表访问互锁功能,可以通过事务处理等方式由数据库自身进行互锁处理,以避免你所出现的"脏读"/"脏写"的问题
modena 2005-03-24
  • 打赏
  • 举报
回复
需要互锁访问,如果你读取的线程相同,直接使用CRITICAL_SECTION就可以了,具体参看"EnterCriticalSection"等相关处理函数.

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧