[英]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.