За последние 24 часа нас посетили 18109 программистов и 1599 роботов. Сейчас ищут 885 программистов ...

блокировка записи в таблице INNODB

Тема в разделе "MySQL", создана пользователем Lokos, 15 май 2014.

  1. Lokos

    Lokos Новичок

    С нами с:
    15 май 2014
    Сообщения:
    4
    Симпатии:
    0
    Здравствуйте
    Задача заключается в следующем когда пользователь запрашивает данные и ему выводится список обычным selct'ом эти записи должны блокироваться от изменения другими пользователями и разблокироваться только когда пользователь перестал их смотреть либо через промежуток времени. Пробовал select for update
    но не помогло. Как этого можно добиться?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    добавить поле-флаг =)
     
  3. Lokos

    Lokos Новичок

    С нами с:
    15 май 2014
    Сообщения:
    4
    Симпатии:
    0
    то есть вы предлагаете что то типо этого
    Код (Text):
    1.  
    2. 'UPDATE tb1 SET `FlagLock`=1,`FlagNameLock`='.$Name.' WHERE (SELECT * FROM tb1 WHERE `какое то условие` and `FlagLock`=0)'
    и после такого блокирования производить манипуляции над этой записью сравнивая ее с пользователем и FlagNameLock?
    Думаете такой способ нормально будет работать?
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну если флаг выставлять как раз в транзакции/блокировке, то мне кажется всё будет хорошо и одновременно двое одну строку не захапают. Можно и без вложенного запроса обойтись.

    Добавлено спустя 2 минуты 6 секунд:
    я думаю можно и без транзакции. заапдейтить не глядя часть строк, которые свободны на юзера. потом работаешь с ними. =)
    еще хорошо бы время залочки тоже писать, чтобы не залипали годами.
     
  5. Lokos

    Lokos Новичок

    С нами с:
    15 май 2014
    Сообщения:
    4
    Симпатии:
    0
    можно чуть подробнее про "транзакции/блокировке" толком ненашjл инфы как это реализовывать на php. Вложенный запрос для того чтоб не кто не влез между запросами
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    транзакции это стандартный механизм мускула. почитайте гденить =)

    а чтобы не влезли я предложил сразу вслепую фигарить апдейт, забирающий часть свободных строк. тогда уж точно никто не влезет.
     
  7. Lokos

    Lokos Новичок

    С нами с:
    15 май 2014
    Сообщения:
    4
    Симпатии:
    0
    что такое транзакция я знаю, но вот применять к php это все как то муторно и глючно и толковых примеров я так и не нашел, может я не так вас понял может вы меня, смысл заблокировать запись не на время выполнения оператора select или update а на время пока пользователь делает с данными манипуляци, то есть он выбрал записей 10 и сидит на них смотрит минут 30 а для остальных они залочены, если я правильно понимаю про транзакции это выглядит так
    Код (Text):
    1.  
    2. start trunsaction
    3. select чето там //начало неявной блокировки
    4. commit //конец неявной блокировки
    строка разблокирована, так происходит ? не в чем не ошибся?
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну флаг же ж поможет короче.
    А что-то делать со строками для пущей верности можно в транзакциях. Если это не "атомарный" апдейт, который происходит за одно действие.
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    transaction пишется через A.
    И ничего там не глючно, и все там ровно и удобно. Можете транзакции через запрос открывать, можете(и это вернее) средствами mysqli управлять процессом. Почитайте, там правда нет ничего сложного.