два способа начала транзакции, в чем разница?

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
tarasnn
Сообщения: 25
Зарегистрирован: 2012.12.30, 21:03

два способа начала транзакции, в чем разница?

Сообщение tarasnn »

знаю о существовании двух способов начала транзакции:

Код: Выделить всё

$transaction = Yii::app()->db->beginTransaction();
или

Код: Выделить всё

$transaction = $Model->dbConnection->beginTransaction();
а в чем разница?
20Gb Free Cloud Storage https://copy.com?r=Witun3
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: два способа начала транзакции, в чем разница?

Сообщение Nafania »

http://www.yiiframework.com/doc/api/1.1 ... ion-detail
Если увидите код, то поймете, что ни в чем.
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: два способа начала транзакции, в чем разница?

Сообщение S c »

та никакой. в любом случае транзакция вызывается у экземпляра cdbconnection. 1й вариант использую. Второй - это типа для AR, хотя 1й тоже для АR подходит
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: два способа начала транзакции, в чем разница?

Сообщение slavcodev »

Разница все же есть :)

Код: Выделить всё

$transaction = Yii::app()->db->beginTransaction();
Начинает транзакцию у соединения Yii::app()->db

Код: Выделить всё

$transaction = $model->dbConnection->beginTransaction();
Начинает транзакцию у соединения $model->dbConnection

Эти соединения могут быть разные. У модели может быть собственно соединение с базой.
Жду Yii 3!
tarasnn
Сообщения: 25
Зарегистрирован: 2012.12.30, 21:03

Re: два способа начала транзакции, в чем разница?

Сообщение tarasnn »

Я в своем приложении использую возможность работы с двумя БД (юзер при авторизации выбирает Рабочая БД или Тестовая)
Соответственно, использую кастомизированый AR как раз в части getDbConnection() где из Yii::app()->user->getState('dbname') подключаю ту или иную БД.
Везде, до сего момента, транзкции начинал именно как $transaction = Yii::app()->db->beginTransaction();
И тут выяснилось, что транзакции в тестовой БД не работают, только сейчас осенило, что Yii::app()->db берет значение db из конфига (у меня определены db и dbtest), таким образом, я начинал транзакцию в db а писал в dbtest.
Чтобы начать транзакцию в dbtest, соответственно надо делать $transaction = Yii::app()->dbtest->beginTransaction(); что не приемлимо (я ведь не знаю, с какой БД работает юзер), пока остановился на варианте использования $transaction = $Model->dbConnection->beginTransaction(), не очень красиво, но работает.
Это костыль?
20Gb Free Cloud Storage https://copy.com?r=Witun3
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: два способа начала транзакции, в чем разница?

Сообщение slavcodev »

Нет это не костыль. Если работаешь с моделью, логично работать именно с ее подключением.
С подключением приложения работается на уровне приложения, компоненты там всякие.
И почему это не красиво? Очень даже красиво, читая код сразу понятно откуда база и откуда транзакция.
Если смущает dbConnection, сделай в базовой АР геттер getDb() и юзай $model->db :) Хотя по мне так dbConnection норма.
Жду Yii 3!
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: два способа начала транзакции, в чем разница?

Сообщение S c »

С другой стороны Yii::app()->db и Yii::app()->dbtest - тоже можно сделать некую функцию, которая выдавал нужное подключение из сессии.
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: два способа начала транзакции, в чем разница?

Сообщение S c »

mc-bear писал(а):Нет это не костыль. Если работаешь с моделью, логично работать именно с ее подключением.
С подключением приложения работается на уровне приложения, компоненты там всякие.
И почему это не красиво? Очень даже красиво, читая код сразу понятно откуда база и откуда транзакция.
Если смущает dbConnection, сделай в базовой АР геттер getDb() и юзай $model->db :) Хотя по мне так dbConnection норма.
Учитывая что транзакции применяются (чаще всего) для того, чтоб корректно выполнились n запросов, то очень часто часть запросов вообще не относятся к текущей модели, либо вообще часть запросов из построителя. Тогда логичнее опять же использовать app()->db
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: два способа начала транзакции, в чем разница?

Сообщение slavcodev »

S c писал(а):Учитывая что транзакции применяются (чаще всего) для того, чтоб корректно выполнились n запросов, то очень часто часть запросов вообще не относятся к текущей модели, либо вообще часть запросов из построителя. Тогда логичнее опять же использовать app()->db
Все эти n-запросов будут к определнной БД, и модели все учавствующие в этой транзакции юзают одну БД, поэтому все равно из модели лучше взять. А учитывая то что в контроллере я вообще не работаю с БД то для меня ещ елогичнее в модели делать $this->getDbConnection()->beginTransaction(), и я уверен что база именна та что надо, мне не надо думать делать Yii::app()->db или Yii::app()->db1 или может Yii::app()->db100
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: два способа начала транзакции, в чем разница?

Сообщение slavcodev »

S c писал(а):С другой стороны Yii::app()->db и Yii::app()->dbtest - тоже можно сделать некую функцию, которая выдавал нужное подключение из сессии.
Так делать нельзя.
Жду Yii 3!
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: два способа начала транзакции, в чем разница?

Сообщение S c »

понял, действительно логично. Просто реально бывают ситуации когда некое сохранение затрагивает много разных моделей. Хотя конечно можно и рассуждать что раз приходиться сейвить в контроллере значит приложение не верно продумано и тд
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: два способа начала транзакции, в чем разница?

Сообщение slavcodev »

Даже если в контроллере работаешь с базой, ты не должен думать о настройках базы или баз. В контроллере ты работаешь с базой, а что там за база пусть решает приложение или модель. Поэтому ни в коем случае в контроллере, Yii::app()->dbTest, потому что вдруг поменяется условия и уже будет не две БД а три, что тогда, будешь ловить проблемы, будешь лазить в десяток контроллеров и все менять?
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: два способа начала транзакции, в чем разница?

Сообщение slavcodev »

Но хотя перечитав условия, если БД берется из настроек пользователя, вообще-то тут логичнее при загрузке настроек (авторизация например) менять сразу главное общее соединение Yii::app()->setDb().
Жду Yii 3!
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: два способа начала транзакции, в чем разница?

Сообщение yan »

mc-bear писал(а):.. А учитывая то что в контроллере я вообще не работаю с БД то ..
Совсем? Даже не findAll()? Не придираюсь, любопытно, что эта фраза значит.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: два способа начала транзакции, в чем разница?

Сообщение slavcodev »

findAll не имеет ничего общего к базе данных :) Это поиск моделей, модель может работать с БД, а может нет.
Жду Yii 3!
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: два способа начала транзакции, в чем разница?

Сообщение S c »

mc-bear писал(а):Но хотя перечитав условия, если БД берется из настроек пользователя, вообще-то тут логичнее при загрузке настроек (авторизация например) менять сразу главное общее соединение Yii::app()->setDb().
я что то типа этого и имел ввиду
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: два способа начала транзакции, в чем разница?

Сообщение S c »

yan писал(а):
mc-bear писал(а):.. А учитывая то что в контроллере я вообще не работаю с БД то ..
Совсем? Даже не findAll()? Не придираюсь, любопытно, что эта фраза значит.
это все равно метод модели. так же можно и о save() рассуждать
tarasnn
Сообщения: 25
Зарегистрирован: 2012.12.30, 21:03

Re: два способа начала транзакции, в чем разница?

Сообщение tarasnn »

Я сохраняю и валидирую в контроллере (в рамках транзакции, несколько моделей), это не укладывается в парадигму MVC?

Не красивость с моей точки зрения заключается в том, что при $transaction = $Model->dbConnection->beginTransaction() происходит привязка к контексту подзадачи, такой код не вынести в бихейвер и не соглашусь что читать также удобно, в транзакции происходит валидирование нескольких моделей, почему именно стартовать с первой модели? а если порядок валидации поменяется?
Но это только мое мнение.
Но хотя перечитав условия, если БД берется из настроек пользователя, вообще-то тут логичнее при загрузке настроек (авторизация например) менять сразу главное общее соединение Yii::app()->setDb()
mc-bear, не мог бы ты подробнее остановиться на этом моменте?
20Gb Free Cloud Storage https://copy.com?r=Witun3
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: два способа начала транзакции, в чем разница?

Сообщение yan »

mc-bear писал(а):findAll не имеет ничего общего к базе данных :) Это поиск моделей, модель может работать с БД, а может нет.
понятно, видимо по человечески сложно ответить, вопрос вообще-то не про findAll был, я сам не плохо понимаю, что он может делать
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: два способа начала транзакции, в чем разница?

Сообщение slavcodev »

tarasnn писал(а):Я сохраняю и валидирую в контроллере (в рамках транзакции, несколько моделей), это не укладывается в парадигму MVC?
Почему нет? Сохранение, валидация и начало транзакции могут быть в контроллере, потому что вызывается просто метод которое это делает, а вся логика (правила валидации, логика сохранения и выполнение SQL запроса для работы транзации) не делается в контроллере.
tarasnn писал(а):Не красивость с моей точки зрения заключается в том, что при $transaction = $Model->dbConnection->beginTransaction() происходит привязка к контексту подзадачи, такой код не вынести в бихейвер и не соглашусь что читать также удобно, в транзакции происходит валидирование нескольких моделей, почему именно стартовать с первой модели? а если порядок валидации поменяется?
Но это только мое мнение.
Если для конкретного пользователя используется одна база то можно юзать из конфига. Когда же у вас разные модули (модели) используют разные БД, понятно же нужно внимательно выбрать правильную базу. В данном случае не важно из какой модели будет взята база, потому что все модели внутри транзации должны иметь одну и туже БД. В контроллере могут быть несколько таких групп, тогда для каждого соединения будет своя транзакция внутри которой группа моделей.
tarasnn писал(а):
Но хотя перечитав условия, если БД берется из настроек пользователя, вообще-то тут логичнее при загрузке настроек (авторизация например) менять сразу главное общее соединение Yii::app()->setDb()
mc-bear, не мог бы ты подробнее остановиться на этом моменте?
например в CWebUser::afterLogin

Код: Выделить всё

$app = Yii::app();
$app->setDb($app->user->getState('dbname') ? $app->mainDb : $app->testDb); 
Жду Yii 3!
Ответить