Блокирование строки на время изменения

ss25_satana

Новичок
Блокирование строки на время изменения

есть функция редактирования она запрашивает нужную мне строку из таблицы на редактирование


function sale_edit() {
global $db;
$id = $_GET['id'];
include("header.php");
$res = $db->sql_query("SELECT * FROM sale WHERE id='$id'");
$row = $db->sql_fetchrow($res);
echo "<form action=\"admin.php\" method=\"post\" style=\"display: inline\">";
echo "<b>Изменение производителя</b>";
echo "<table width=\"100%\" cellpadding=\"3\" cellspacing=\"1\" border=\"0\" bgcolor=\"#efefef\">\n"
."<tr><td>Наименование</td><td>Адрес</td><td>Телефон</td><td>Доп. телефон</td></tr><tr>\n"
."<input type=\"hidden\" value=\"$id\" name=\"id\">\n"
."<td width=\"30%\" bgcolor=\"#FFFFFF\"><input value=\"$row[name]\" style=\"width=100%\" name=\"name\" size=\"10\" type=\"TEXT\"></td>\n"
."<td width=\"30%\" bgcolor=\"#FFFFFF\"><input value=\"$row[adress]\" style=\"width=100%\" name=\"adress\" size=\"10\" type=\"TEXT\"></td>"
."<td bgcolor=\"#FFFFFF\"><input value=\"$row[tel0]\" style=\"width=100%\" name=\"tel0\" size=\"10\" type=\"TEXT\"></td>"
."<td bgcolor=\"#FFFFFF\"><input value=\"$row[tel1]\" style=\"width=100%\" name=\"tel1\" size=\"10\" type=\"TEXT\"></td></tr>\n"
."<tr><td><input type=\"hidden\" name=\"go\" value=\"item\">\n"
."<input type=\"hidden\" name=\"in\" value=\"sale_save_edit\">\n"
."<input type=\"submit\" value=\"Изменить\"></td></tr>\n";
echo "</table><form>";

include("footer.php");
}



и есть функция сохранения изменений

function sale_save_edit() {
global $db;
$id = $_POST['id'];
$name = $_POST['name'];
$adress = $_POST['adress'];
$tel0 = $_POST['tel0'];
$tel1 = $_POST['tel1'];
$db->sql_query("UPDATE sale SET name='$name', adress='$adress', tel0='$tel0', tel1='$tel1' WHERE id='$id'");
Header("Location: admin.php?go=item&in=sale_list");
}


подскажите можна ли вообще заблокировать конкретную строку в таблице (тип таблицы MyISAM)
блокировка всей таблицы не желательна так как между запросом на изменение и сохраненнеим изменений может пройти значительное время и эта строка не долна быть доступна для изменения другими пользователями а только тому кто ее открыл на изменение
 

Апельсин

Оранжевое создание
реально заблокировать - никак.
можешь посмотреть на функции get_lock()/is_free_lock()/release_lock(). Они не блокируют ничего, но их можно использовать в качестве индикатора.
 

ss25_satana

Новичок
может стоит использовать другую бд где эти возможности есть
подскажите в какой бд эт нормально реализовано Мелкософт скьюэль и оракл не предлогать
 

ss25_satana

Новичок
у кого нить есть соображение как сами скриптом сэмулировать блокировку на время изменения строки
 

Фанат

oncle terrible
Команда форума
догадаться добавить в таблицу поле - признак блокировки не судьба?
 

ss25_satana

Новичок
делал так но если после открытия наизменение это поле измененица то если не потвердить изменения то строка так и будет залочена
 

Фанат

oncle terrible
Команда форума
и что?
по-твоему, другие блокировки действуют как-то по-другому?
 

bgm

&nbsp;
Подсказка: флаг блокировки может быть любым - к примеру, время истечения блокировки.
 

ss25_satana

Новичок
значит в MySQL это не реально сделать

2ФАНАТ А в PostgrSQL возможна болкировка конкретной строки в таблице?
 

Фанат

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

ss25_satana

Новичок
Автор оригинала: bgm
Подсказка: флаг блокировки может быть любым - к примеру, время истечения блокировки.
я думал на этим если писать время окончания блокировки но если чел не успевает за определенное время внести изменения то строка тогда считаеца разблокированной
 

Апельсин

Оранжевое создание
ss25_satana, ты читал в мануале описание функий о которых я говорила выше?

блокировка на уровне строк усуществляется для транзакционных таблиц. MyISAM - не транзакционная.
 

ss25_satana

Новичок
2bgm почитал спасибо с этим понятно


2Апельсин

SELECT GET_LOCK ('COST ON ITEMS.ID = 3', 60);
UPDATE ITEMS SET COST = 3.142 WHERE ID = 3;
SELECT RELEASE_LOCK ('COST ON ITEMS.ID = 3');

цитата из статьи "
В таблице ITEMS запрашиваем блокировку для строки с номером 3, причем имя блокировки выбрано произвольно. Суть такого механизма в том, что все приложения придерживаются единого правила именования блокировок. Здесь нет таких издержек, которые свойственны транзакциям, хотя преимущества, по сути, те же самые. "

несовсем понятно насчет имени блокировки

т.е
SELECT GET_LOCK ('COST ON ITEMS.ID = 3', 60);
устанавливает блокировку на строку со сзначением ID = 3 в таблице ITEMS и обзывает блокировку COST
 

Апельсин

Оранжевое создание
> устанавливает блокировку на строку со сзначением ID = 3 в таблице ITEMS и обзывает блокировку COST

он не блокирует никакие строки, вообще. Это просто флаг. Ты можешь дать ему имя составленное от строки которую ты блокируешь.
В твоем примере устанавливается лок с именем 'COST ON ITEMS.ID = 3'. Все.
 

dr-sm

Новичок
я бы все-таки не рекомендовал...

то что называется в СУБД блокировка на уровне строк не имеет ничего общего с тем, что ты хочешь сделать.

как вариант, у строки флаг блокировки + свой хендлер сессии который чистит блокировки при протухании. но IMHO ты сам себе придумываешь проблемы.
 
Сверху