присутствие "отсутствующей" записи в БД

mars37

Новичок
присутствие "отсутствующей" записи в БД

Ситуация такая...
Сессионные данные обрабатываюся MySql (обработчики сессий установлены session_set_save_handler(...)).
Таблица, где храняться сессионные данные имеет такую структуру:
PHP:
CREATE TABLE sessions (
  id int unsigned NOT NULL auto_increment,
  sess_key varchar(50) NOT NULL default '',
  sess_data text NOT NULL,
  update_time int unsigned NOT NULL default '0',
  PRIMARY KEY  (id),
  UNIQUE KEY sess_key (sess_key)
);
Всё нормально работало больше года, но в последнее время иногда стали появляться такие ошибки SQL:

SQL-query: INSERT INTO sessions (sess_key, sess_data, update_time) VALUES ('2fd1855102c5fb23b21428491b5b4cf8',
'cookie name|N;', '1208569324')
Server response: Duplicate entry '2fd1855102c5fb23b21428491b5b4cf8' for key 2

Механизм записи данных в сессию:
в функцию записи данных передаются параметры $sess_key (ключ сессии) и $sess_data
1. $id = sql_value("Select id from session where sess_key=$sess_key");
2. если $id - натуральное число, то делаю update sessions set sess_data=...
3. иначе делаю insert, который и вызывает вышеприведённую ошибку.

Т.е., в чём проблема? Выбираю id у записи по определённому условию; если такой нет, то делаю вставку, и тут mysql ругается на то, что такая запись есть...

Между запросом записи и вставкой, в данном случае, может-ли вклиниться вставка от другого скрипта?
Кто-нибудь сталкивался с такой или похожей проблемой?
 

berkut

Новичок
вот это кто-то похоже в книжке написал и все в любую таблицу пихают обязаловкой auto_increment
 

mars37

Новичок
Автор оригинала: *****
а нафига этой таблице вообще id?
Честно говоря, не знаю. Похоже, что id нигде и не используется. Табличка была создана давно, и не мной.

Т.е. Вы неявно предлагаете:
1. убрать id
2. в качестве первичного ключа использовать sess_key
3. использовать update; if (affected_row==0) insert
Правильно?

Но всё-же хотелось бы знать, почему такие ошибки стали возникать... Неужели из за "вклинивания"? С тем-же ключом сессии???
 

weregod

unserializer
1) LOCK TABLES перед SELECT, UNLOCK после INSERT
2) если сессионный ключ есть возможность создать самому
do
{
$key = .....;
INSERT...
} while (errorcode от mysql == ... (duplicate value))

3) надеюсь, устаревшие записи вычищаются время от времени ?
 

Фанат

oncle terrible
Команда форума
mars37
я не понимаю, что ты называешь вклиниванием.
механизм у тебя простой, как 2 копейки.
если база говорит что ключ уже есть - ищи, откуда он взялся.
непонятно, чего ты от форума хочешь.
чтобы тебе сказали, что в пхп есть баг, который пишет Duplicate entry при хранении сессий в базе?

-~{}~ 06.03.08 22:40:

ты бы хоть проверил, id у этих совпадающих ключей совпадает или нет.
 
Сверху