我的程序起了几个数据库连接,并且开了几个线程抢数据库连接来调用存储过程,存储过程的功能是返回一批记录,并把这批记录打上标记,就不会被取出了。现在的现象是
线程1调用了存储过程后取会5条记录如 101,102,103,104,105
但线程2会返回102,103,105,106,107出现不该出现的重复现象
请问这是为什么,该怎么解决?
请教,谢谢!

解决方案 »

  1.   

    需要互锁访问,如果你读取的线程相同,直接使用CRITICAL_SECTION就可以了,具体参看"EnterCriticalSection"等相关处理函数.
      

  2.   

    另外比如SQLSERVER数据库自身带表访问互锁功能,可以通过事务处理等方式由数据库自身进行互锁处理,以避免你所出现的"脏读"/"脏写"的问题
      

  3.   

    我是同样的线程,WinThread开了5个
      

  4.   

    不是很了解CRITICAL_SECTION和共享内存,能不能举个例子说明一下
    谢谢!
      

  5.   

    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;
    }