Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL ODBC-外键信息插入选择的并发事务_Sql Server_Concurrency_Transactions_Odbc - Fatal编程技术网

Sql server SQL ODBC-外键信息插入选择的并发事务

Sql server SQL ODBC-外键信息插入选择的并发事务,sql-server,concurrency,transactions,odbc,Sql Server,Concurrency,Transactions,Odbc,我正在实现一个ODBC应用程序,其中多个客户端将数据存储在两个具有外键关系的表中。此应用程序应以类似的方式支持不同的数据库。因此,sql命令外部化在文件中,并且应该以类似的结构编写 为了缩小范围,我有一个基于SQL Server语法的简化示例: CREATE TABLE A ( id int IDENTITY(1,1) PRIMARY KEY, name varchar(max) NO NULL ); CREATE TABLE B ( id int IDENTITY(1

我正在实现一个ODBC应用程序,其中多个客户端将数据存储在两个具有外键关系的表中。此应用程序应以类似的方式支持不同的数据库。因此,sql命令外部化在文件中,并且应该以类似的结构编写

为了缩小范围,我有一个基于SQL Server语法的简化示例:

CREATE TABLE A
(
    id int IDENTITY(1,1) PRIMARY KEY,
    name varchar(max) NO NULL
);

CREATE TABLE B
(
    id int IDENTITY(1,1) PRIMARY KEY,
    data varchar(max) NO NULL,
    A_id int NOT NULL,
    FOREIGN KEY (A_id) REFERENCES A (id) ON DELETE CASCADE ON UPDATE CASCADE
);
这些值由以下SQL代码通过
SQLExecDirect
插入:

BEGIN TRANSACTION;

INSERT INTO A (name)
VALUES ('John');

INSERT INTO B (data)
VALUES ('Some data', (SELECT MAX(id) FROM A));

COMMIT TRANSACTION;
我已经设置了以下语句属性:

SQLSetStmtAttr(hStmt, SQL_ATTR_CONCURRENCY, (SQLPOINTER)SQL_CONCUR_LOCK, 0));

SQLSetStmtAttr(hStmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) SQL_CURSOR_KEYSET_DRIVEN, 0));

SQLSetStmtAttr(hStmt, SQL_ATTR_QUERY_TIMEOUT, (SQLPOINTER)300, SQL_IS_UINTEGER));
自动提交的连接属性已禁用:

SQLSetConnectOption(m_hDBC, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF);
当从两个客户机并行测试时,我遇到的情况是,来自A的最大主键不是来自当前事务的,而是来自另一个客户机的

换句话说,客户机1对表A的INSERT命令对客户机2的INSERT-SELECT子句可见。如何避免这种情况

顺便说一句,我知道我可以使用OUTPUT在sqlserer的第一个INSERT语句中检索主键。其他一些SQL方言也有返回,但也有一些方言不提供返回此ID的可能性,因此我不喜欢使用这种技术,而是喜欢使用带有表a最大ID嵌套选择的INSERT


我想知道我在保存此事务时缺少了什么。

您是否考虑过在事务中使用SCOPE\u标识将作用域与客户端上下文隔离

我没有用作用域标识测试它,但这与使用输出或返回类似。我正在寻找一种机制,它可以以类似的方式用于所有数据库系统。