我需要在MSSQL Server数据库中执行一些数据计算,然后将结果保存在同一数据库中。
我需要将表的(部分)数据加载到C++数据结构中,执行一个可能需要相当长时间的计算,最后向同一表中添加一些行。
问题在于,多个用户可以同时访问数据库,并且由于数据加载到内存中直到计算结果写入表格,因此我希望锁定该表格。
使用ODBC SDK,是否可以显式锁定和解锁表的一部分?
我尝试了以下测试程序,但不幸的是,在StmtHandle1
被释放之前,INSERT
语句成功执行:
SQLDriverConnect(ConHandle1, NULL, (SQLCHAR *)"DRIVER={ODBC Driver 13 for SQL Server};"
"SERVER=MyServer;"
"DATABASE=MyDatabase;"/*, ... */);
SQLSetStmtAttr(StmtHandle1,SQL_ATTR_CONCURRENCY,(SQLPOINTER)SQL_CONCUR_LOCK,SQL_IS_INTEGER);
SQLExecDirect(StmtHandle1, (SQLCHAR *)"SELECT * FROM [MyTable] WITH (TABLOCKX, HOLDLOCK)", SQL_NTS);
SQLDriverConnect(ConHandle2, NULL, (SQLCHAR *)"DRIVER={ODBC Driver 13 for SQL Server};"
"SERVER=MyServer;"
"DATABASE=MyDatabase;"/*, ... */);
SQLSetStmtAttr(StmtHandle2,SQL_ATTR_CONCURRENCY,(SQLPOINTER)SQL_CONCUR_LOCK,SQL_IS_INTEGER);
SQLExecDirect(StmtHandle2, (SQLCHAR *)"INSERT INTO [MyTable] VALUES (...)", SQL_NTS);
SQLSetConnectAttr(ConHandle, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF, NULL);
,然后使用SQLEndTran(SQL_HANDLE_DBC, ConHandle, SQL_COMMIT);
提交事务。 - metalfox