Действительно ли безопасно установить изоляцию MySQL для “Чтения Незафиксированный” (грязные чтения) для типичного веб-использования? Даже с репликацией?

Я работаю над веб-сайтом с типичным веб-шаблоном использования CRUD: подобный блогам или форумам, где пользователи создают/обновляют содержание и других пользователей, читает содержание.

Кажется, что нормально устанавливать уровень изоляции базы данных для "Чтения Незафиксированный" (грязные чтения) в этом случае. Мое понимание общего недостатка "Чтения, Незафиксированного", то, что читатель может считать незафиксированные данные, которые будут позже откатываться.

В шаблоне использования блога/форума CRUD там когда-либо будет какой-либо откат? И даже если существует, там какая-либо основная проблема с чтением незафиксированных данных?

Прямо сейчас я не использую репликации, но в будущем, если я захочу использовать репликацию (находящийся на строке, то не основанный на операторе) будет "Чтение Незафиксированный" уровень изоляции препятствовать тому, чтобы я делал так?

Что Вы думаете? Кто-либо попытался использовать "Чтение, Незафиксированное" на их RDBMS?

6
задан Continuation 8 January 2010 в 05:57
поделиться

2 ответа

[

]MySQL 5.1 строже при использовании read-uncommitted и binlogging (необходимых для репликации) - так что вы можете получить ошибки на некоторых простых операторах обновления/удаления, которые не попадут в уровень изоляции по умолчанию REPEATABLE READ. Я видел простые обновления PK, такие как:[

] [

]Update foo set bar=1 where id=1234;[

] [

]Error with: mysql_real_query ошибка 1598 сообщение : Binary заготовка леса невозможна. Сообщение: Уровень транзакции "READ-UNCOMMITTED" в InnoDB небезопасен для бинлог-режима "STATEMENT"[

] [

]Поэтому вы должны быть готовы к тому, чтобы справиться с этим, переключившись обратно на повторяющиеся чтения при изменении данных, или используя отдельные соединения для чтения и записи, с собственными уровнями изоляции. Последние могут быть удобны, когда/если ваш проект нуждается в масштабировании и репликации, так что вы можете послать select ведомому только на чтение и записать на мастера.[

] [

]OTOH, использование read-uncommitted for reads может быть реальным выигрышем, если последовательные чтения строго не нужны, так как Innodb имеет меньше блокировок для взлома. [

] [

]Что касается вопроса о том, возможны ли откаты, то я думаю, что вы - лучший человек, который может рассказать нам об этом, так как именно вы кодируете его :).[

].
3
ответ дан 17 December 2019 в 04:47
поделиться

Я не уверен, что вызывает такое поведение в спящем режиме, вы можете получить, загрузив Child сначала. Отдельное удаление Child не является обязательным. Обновленный код должен выглядеть следующим образом:

Transaction tx = session.beginTransaction();  //session is of type org.hibernate.Session

try {
    Parent parent = (Parent) session.get(Parent.class, getParentId());

    Iterator i = form.getDeleteItems().iterator();  //form is of type org.apache.struts.action.ActionForm
    while(i.hasNext()){
        Child child = (Child) session.get(Chile.class, ((Child) i.next()).getChildId());
        parent.getChildren().remove(child); //getChildren() returns type java.util.List
    }

    session.saveOrUpdate(parent);
    tx.commit();
} ...

показать SQL, созданный Hibernate

<property name="show_sql">true</property>
<property name="format_sql">true</property>

Edit:

Извлечь эту главу 10. Работа с объектами

-121--4998541-

Я не знаю полных условий, но я считаю, что тот факт, что вы возвращаете параметр, а не экземпляр, созданный в функции, вызывает проблему в вашем примере.

Для меня следующий показал один и тот же адрес для обоих:

#include <iostream>
#include <string>

std::string foo()
{
   std::string s("rvo!");
   std::cout << "address: " << (void *)(&s) << std::endl;
   return s;
}

int main()
{
   const std::string s = foo();
   std::cout << "address: " << (void *)(&s) << std::endl;
   std::cout << s << std::endl;
   return 0;
}

В дополнение к комментарию Дарида

Кодовая страница о странице документы, которые для нее использовать -fno-elide-конструкторы для C++. Документация для этой опции формирует состояние «g++ man page»:

Стандарт C++ позволяет исключить возможность создания временный, который используется только для инициализации другого объекта того же типа. Указание этого параметра отключает эту оптимизацию, и заставляет G++ вызывать конструктор копирования во всех случаях.

Компиляция с помощью конструкторов -fno-elide предотвращает RVO, но компиляция без этого позволяет.

-121--3603241-

Этот уровень изоляции означает, что вы можете считывать противоречивые данные. Нет гаранта того, что считанные данные находятся в согласованном представлении базы данных.

Если это проблема, то это не вопрос MySQL, а вопрос приложения, который предполагает оценку риска использования/возврата противоречивых данных.

В приложении для интернет-банкинга это может привести к отказу. От игры это может быть ОК. Это зависит.

Я использовал как «чтение незафиксировано», так и репликацию, и у меня не было проблем.

2
ответ дан 17 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: