RetCode = SQLPrepare(StmtHandle, SQLStmt, SQL_NTS);
sleep(20);
RetCode = SQLExecute(StmtHandle);
if (RetCode == SQL_SUCCESS)
{
SQLBindCol(StmtHandle, 1, SQL_C_CHAR, (SQLPOINTER)
name, sizeof(name), NULL);
SQLBindCol(StmtHandle, 2, SQL_C_CHAR, (SQLPOINTER)
age, sizeof(age), NULL);
while (RetCode != SQL_NO_DATA)
{
RetCode = SQLFetch(StmtHandle);
if (RetCode != SQL_NO_DATA)
printf("%-8s %s\n", name, age);
}
}
printf("Tran completed.\n");
RetCode = SQLEndTran(SQL_HANDLE_DBC, ConHandle,
SQL_COMMIT);
按说SQLPrepare()会自动开启事务并加锁,可在执行程序等待的20秒里,我可以随便往表里插入数据
这怎么回事啊
------解决方案--------------------------------------------------------
这跟隔离级别有关,如果你要事务期间不能插入数据就把隔离级别设置为RR,在你的SQL语句后面加上WITH RR就行了。下面贴点关于隔离级别的内容供你参考:
------解决方案--------------------------------------------------------
SQLPrepare()阶段还没执行,要等执行了再加锁
------解决方案--------------------------------------------------------
不指定是db2默认隔离级别:CS(游标稳定性)
如果在程序里指定隔离级别,那么将覆盖默认的CS隔离级别
即使是默认的CS隔离级别,那么update一个表,将锁定相应的目标