Вопрос такой, я хочу завести в базе счетчик посещений на некоторые страницы.
Там надо просто извлечь из базы текущее значение в контроллере или во вьюшке, и приплюсовать единичку, записать снова в базу.
Но если одновременно несколько пользователей будет заходить туда, то может получиться что в базу запишется неверное число. Так как один пока заходит, другой уже обновил базу и первый просто не учтет изменения которые сделал второй.
Как можно решить эту проблему.
Пока мысли такие что обернуть весь запрос в базу в транзакцию. Поможет ли это? Правильно ли я понимаю что если эти операции будут в транзакции, то тогда эти таблички будут залочены для всех других операций, до тех пор пока транзакция не завершится?
И есть ли какие-то штатные методы работы с такими вещами.
Еще думаю такой вариант, сделать это через SQL выражение типа Update. Но тут тоже нету полного понимание, может ли в таком случае все-таки потеряться единичка.
Здравствуйте, Эолинн, Вы писали:
Э>Привет, ребята!
Э>Вопрос такой, я хочу завести в базе счетчик посещений на некоторые страницы. Э>Там надо просто извлечь из базы текущее значение в контроллере или во вьюшке, и приплюсовать единичку, записать снова в базу. Э>Но если одновременно несколько пользователей будет заходить туда, то может получиться что в базу запишется неверное число. Так как один пока заходит, другой уже обновил базу и первый просто не учтет изменения которые сделал второй. Э>Как можно решить эту проблему.
Э>Пока мысли такие что обернуть весь запрос в базу в транзакцию. Поможет ли это? Правильно ли я понимаю что если эти операции будут в транзакции, то тогда эти таблички будут залочены для всех других операций, до тех пор пока транзакция не завершится?
Не совсем, есть разные уровни изоляции транзакций.
Э>И есть ли какие-то штатные методы работы с такими вещами.
Здравствуйте, Эолинн, Вы писали:
Э>Пока мысли такие что обернуть весь запрос в базу в транзакцию. Поможет ли это? Правильно ли я понимаю что если эти операции будут в транзакции, то тогда эти таблички будут залочены для всех других операций, до тех пор пока транзакция не завершится? Э>И есть ли какие-то штатные методы работы с такими вещами.
Можно использовать Optimistic Concurrency — если обновление не прошло то, просто повторить с новым значением.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.