作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我必须对存储在 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);
最佳答案
unfortunately the INSERT statement succeeds before StmtHandle1 is freed
默认情况下,SQL Server 在自动提交模式下运行,即打开一个 tarnsaction 并为您提交。
您请求了 TABLOCKX
并且该表在您的事务期间被锁定,但您想要的是明确地打开一个事务并且不提交
/rollback
它直到你完成你的计算,即你应该使用
begin tran; SELECT top 1 * FROM [MyTable] WITH (TABLOCKX, HOLDLOCK);
而且您不需要阅读整个表格,top 1 *
就足够了。
关于c++ - 使用 ODBC 显式锁定和解锁表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46886427/
我是一名优秀的程序员,十分优秀!