Sql server SQL ODBC-外键信息插入选择的并发事务
我正在实现一个ODBC应用程序,其中多个客户端将数据存储在两个具有外键关系的表中。此应用程序应以类似的方式支持不同的数据库。因此,sql命令外部化在文件中,并且应该以类似的结构编写 为了缩小范围,我有一个基于SQL Server语法的简化示例: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
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标识将作用域与客户端上下文隔离 我没有用作用域标识测试它,但这与使用输出或返回类似。我正在寻找一种机制,它可以以类似的方式用于所有数据库系统。