MySql Транзакции - PullRequest
       2

MySql Транзакции

2 голосов
/ 30 июля 2010

Итак, у меня есть два метода. Метод первый добавляет строку в мою базу данных. Второй метод выбирает и обновляет последние 10 строк таблицы.

Если метод один добавляет новую строку после того, как метод два выберет данные, но перед его обновлением будет ли метод два обновить неправильные 10 строк? Помогут ли здесь транзакции или мне нужно заблокировать таблицы?

function one(){
    insert row
}

function two(){
    select latest 10 rows
    update latest 10 rows
}

// РЕДАКТИРОВАНИЕ //////////////////////////////////////////////// /////////////////////////////////

Я неохотно добавлял свои настоящие методы (это методы codeIgniter), но здесь они

function one(){
    insert row
}

function two(){
    $this->db->where('status', '1');
    $this->db->limit(10);
    $query = $this->db->get('rrsf_users');

    $this->db->where('status', '1');
    $this->db->limit(10);
    $this->db->update('rrsf_users', array('status' => '2'));    
}

Таким образом, это выглядит как два отдельных запроса, отсюда и проблема «текущих последних 10 строк». Не уверен, что лучшее решение для этого. Блокировать таблицы или циклически обрабатывать каждый индекс, выбранный в запросе, и добавлять его в запрос where?

Ответы [ 5 ]

2 голосов
/ 30 июля 2010

Это зависит от того, как вы выберете эти 10 строк. Если у вас есть уникальный индекс на них, и вы знаете, какие 10 строк нужно обновить (и что вы обновляете, это именно те 10 строк, которые были выбраны ранее), то у вас нет проблем. Конечно, если вы пишете оператор обновления таким образом, что вы обновляете только что вставленную строку, у вас возникает эта проблема. Блокировка на самом деле здесь вам мало поможет, потому что вы можете заблокировать только то, что уже есть.

Короче говоря: если вы знаете, что вы обновляете, у вас нет проблем. Если вы обновите «текущие последние 10 строк», у вас возникнет проблема.

0 голосов
/ 30 июля 2010

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

$this->db->where('status', '1');
$query = $this->db->get('rrsf_users', 10);
$result = $query->result_array();
foreach ($result as $value) {
    $this->db->or_where('id_user', $value['id_user']); 
}           
$this->db->update('rrsf_users', array('status' => '2')); 
return $query->result_array();
0 голосов
/ 30 июля 2010

Вопрос запутанный.Если вы выбираете последние 10 строк из таблицы, то вы вставляете в эту таблицу еще одну строку, то, что возвращается из вашего SELECT, не изменяется.

Хотите обновить 10 выбранных ранеена вставку?Если это так, обновите возвращенные строки, которые кэшируются, и сохраните их идентификаторы, чтобы вернуться и ОБНОВИТЬ их.Если вы хотите обновить последние 10 строк в целом, то:

  1. Почему вы делаете SELECT?Сначала вставьте строку, а затем вызовите two ().

  2. Все должно быть хорошо, как сейчас.

0 голосов
/ 30 июля 2010

Вы можете использовать LOCK для этого.

ВЫБРАТЬ * ИЗ bla ЗАКАЗАТЬ ПО foo DESC LIMIT 10 ДЛЯ ОБНОВЛЕНИЯ

выберет последние записи и заблокирует их, пока вы не обновите их.

выдача ОБНОВЛЕНИЯ bla [...] удалит БЛОКИРОВКУ

0 голосов
/ 30 июля 2010

у вас не будет проблем.

когда вы выбираете 10 строк, вы знаете строки, которые нужно обновить. Какова цель обновления последних 10 строк, когда вы можете обновить те строки, которые вернули? или если вам нужно обновить 10 последних строк, какова цель выбора?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...