繁体   English   中英

使用ODBC显式锁定和解锁表

[英]Explicitly lock and unlock a table using ODBC

我必须使用存储在MSSQL Server数据库中的数据执行一些计算,然后将结果保存在同一个数据库中。

我需要将一个表加载(部分)到C ++数据结构中,执行计算(可能需要很长时间),最后将一些行添加到同一个表中。

问题是几个用户可以同时访问数据库,我希望锁定表,因为数据已加载到内存中,直到计算结果写入表。

使用ODBC SDK,是否可以显式锁定和解锁部分表?

我尝试了以下测试程序,但遗憾的是INSERT语句在释放StmtHandle1之前成功:

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

不幸的是,INSERT语句在释放StmtHandle1之前成功

默认情况下,SQL Server以自动提交模式运行,即打开tarnsaction并为您提交。

您请求TABLOCKX并且表在事务持续期间被锁定,但您想要的是明确地打开事务并且在您完成计算之前不commit / rollback它,即您应该使用

begin tran; SELECT top 1 * FROM [MyTable] WITH (TABLOCKX, HOLDLOCK);

而且你不需要阅读整个表格, top 1 *就足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM