UNLOCK таблицы

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
nootropil
Сообщения: 46
Зарегистрирован: 2015.11.21, 18:45

UNLOCK таблицы

Сообщение nootropil »

Добрый день.

Подскажите, делает ли "rollBack" снятие блокировки с таблицы если её указывать как приведено ниже?

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

    const ESTIMATE_IDENTITY_TABLE_NAME = 'estimate_identity';
    const ESTIMATE_IDENTITY_SEQ = 'estimate_identity_id_seq';

    public function getNextEstimateIncrement()
    {
        $year = (int)date('Y');
        $connection = \Yii::$app->getDb();
        $transaction = $connection->beginTransaction();
        
        $connection->createCommand('LOCK TABLE estimate_identity IN SHARE ROW EXCLUSIVE MODE')->execute();
        
        try {
            $numberOfRecordsInYear = (int)$connection->createCommand('SELECT COUNT(*) FROM ' . self::ESTIMATE_IDENTITY_TABLE_NAME . ' WHERE year = :year')
                ->bindParam(':year', $year)->queryOne()['count'];
            if ($numberOfRecordsInYear === 0) {
                $connection->createCommand('DELETE FROM ' . self::ESTIMATE_IDENTITY_TABLE_NAME)->execute();
                $connection->createCommand('ALTER SEQUENCE ' . self::ESTIMATE_IDENTITY_SEQ . ' RESTART WITH 1')->execute();
            }
            $connection->createCommand('INSERT INTO ' . self::ESTIMATE_IDENTITY_TABLE_NAME . ' (year) VALUES (:year)')->bindParam(':year', $year)->execute();
            $reserved = $connection->createCommand('SELECT id, year FROM ' . self::ESTIMATE_IDENTITY_TABLE_NAME . ' ORDER BY id DESC LIMIT 1 ')->queryOne();
            $transaction->commit();
        } catch (\Exception $e) {
            $transaction->rollBack();
            throw $e;
        } catch (\Throwable $e) {
            $transaction->rollBack();
            throw $e;
        }
        var_dump(['year' => $reserved['year'], 'increment' => $reserved['id']]);
    }
Эксперементы показывают что-то не очень внятное.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: UNLOCK таблицы

Сообщение samdark »

Нет, не делает.
nootropil
Сообщения: 46
Зарегистрирован: 2015.11.21, 18:45

Re: UNLOCK таблицы

Сообщение nootropil »

samdark писал(а): 2017.01.17, 11:57 Нет, не делает.
То есть в блоке "catch" после "rollBack" нужно делать что-то вроде:

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

$connection->createCommand('COMMIT WORK')->execute();
?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: UNLOCK таблицы

Сообщение samdark »

Скорее

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

$connection->createCommand('UNLOCK TABLES')->execute();
nootropil
Сообщения: 46
Зарегистрирован: 2015.11.21, 18:45

Re: UNLOCK таблицы

Сообщение nootropil »

samdark писал(а): 2017.01.17, 12:35 Скорее

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

$connection->createCommand('UNLOCK TABLES')->execute();
К сожалению не для PostgreSQL.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: UNLOCK таблицы

Сообщение samdark »

А что за СУБД?
nootropil
Сообщения: 46
Зарегистрирован: 2015.11.21, 18:45

Re: UNLOCK таблицы

Сообщение nootropil »

samdark писал(а): 2017.01.18, 01:14 А что за СУБД?
PostgreSQL 9.5
Судя по всему именно "rollback" должен автоматом это делать поскольку блокировка снимается в конце транзакции:
https://www.postgresql.org/docs/9.1/sta ... -lock.html
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: UNLOCK таблицы

Сообщение samdark »

Я думал, что речь про MySQL.
Ответить