Я работаю над веб-сайтом с типичным веб-шаблоном использования CRUD: подобный блогам или форумам, где пользователи создают/обновляют содержание и других пользователей, читает содержание.
Кажется, что нормально устанавливать уровень изоляции базы данных для "Чтения Незафиксированный" (грязные чтения) в этом случае. Мое понимание общего недостатка "Чтения, Незафиксированного", то, что читатель может считать незафиксированные данные, которые будут позже откатываться.
В шаблоне использования блога/форума CRUD там когда-либо будет какой-либо откат? И даже если существует, там какая-либо основная проблема с чтением незафиксированных данных?
Прямо сейчас я не использую репликации, но в будущем, если я захочу использовать репликацию (находящийся на строке, то не основанный на операторе) будет "Чтение Незафиксированный" уровень изоляции препятствовать тому, чтобы я делал так?
Что Вы думаете? Кто-либо попытался использовать "Чтение, Незафиксированное" на их RDBMS?
]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 имеет меньше блокировок для взлома. [
] []Что касается вопроса о том, возможны ли откаты, то я думаю, что вы - лучший человек, который может рассказать нам об этом, так как именно вы кодируете его :).[
]. Я не уверен, что вызывает такое поведение в спящем режиме, вы можете получить, загрузив 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, а вопрос приложения, который предполагает оценку риска использования/возврата противоречивых данных.
В приложении для интернет-банкинга это может привести к отказу. От игры это может быть ОК. Это зависит.
Я использовал как «чтение незафиксировано», так и репликацию, и у меня не было проблем.