gpt4 book ai didi

c++ - 使用 ODBC 显式锁定和解锁表

转载 作者:太空狗 更新时间:2023-10-29 21:34:21 25 4
gpt4 key购买 nike

我必须对存储在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com