Если у меня есть 2 следующие функции:Является ли возвращение last_insert_id всегда правильным?
int AccessDb::InsertColValue(string tableName, string col, string val)
{
try
{
sql::Statement *stmt;
bool ret;
if ((nomTable != "") && (col != "") && (val != ""))
{
string query = "INSERT INTO " + tableName + "(" + col + ") values (";
query += val + ");";
stmt = con->createStatement();
ret = stmt->execute(query);
}
delete stmt;
return 0;
}
catch (sql::SQLException &e)
{
return -1;
}
}
и
long AccessDb::LastInsertId()
{
try
{
sql::Statement *stmt;
sql::ResultSet *res;
string query = "SELECT LAST_INSERT_ID() AS LAST_ID";
stmt = con->createStatement();
res = stmt->executeQuery(query);
delete stmt;
long lastId;
while (res->next())
{
lastId = res->getInt("LAST_ID");
}
return lastId;
}
catch (sql::SQLException &e)
{
return -1;
}
}
Могу ли я быть уверен, что возвращение LastInsertId() всегда будет давать мне правильный идентификатор, если я пишу следующие строки и если идентификатор автоматически генерируется базой данных?
AccessDb adb; // initialize the connexion with the db
int ret = adb.InsertColValue("people", "name", "John");
if (ret == 0)
long lastId = adb.LastInsertId();
Если предыдущий код называется где-то еще в то же самое время, я могу иметь неверное значение в моей lastId переменной? Если да, нужно ли мне использовать блокировки и разблокировки на моем столе, чтобы избежать этого или другого решения?
Функция зависит от сеанса, поэтому до тех пор, пока только один процесс может быть связан с данным сеансом, он вернет последний идентификатор вставки для этого сеанса. – Strawberry