Понимание и обработка параллелизма транзакций базы данных

задняя часть база данных MySQL Безопасность

Понимание и обработка параллелизма транзакций базы данных

  • концепция параллелизма:существуетоперационная система, параллелизм означает, что существует несколько программ в период времени между началом выполнения и завершением выполнения, и все эти программы находятся в одном и том жепроцессорБег на процессоре, но только одна программа работает на процессоре в любой момент времени.

    В реляционной базе данных - процесс, который позволяет нескольким пользователям одновременно получать доступ к общим данным и изменять их.

  • понять концепцию транзакций

    1. концепция:

      Транзакции MySQL в основном используются для обработки данных с большим объемом операций и высокой сложностью.Например, в системе управления персоналом, если вы удаляете человека, вам нужно удалить как основную информацию о человеке, так и информацию, относящуюся к лица, такие как почтовые ящики, статьи и т. д., таким образом, эти инструкции по работе с базой данных составляют транзакцию!

    2. Четыре важные характеристики транзакций

      • атомарность:

        Все операции в транзакции либо завершатся, либо завершатся неудачно, и не завершатся в какой-то момент посередине. Если во время выполнения транзакции возникает ошибка, происходит ее откат (Rollback) до состояния до начала транзакции, как если бы транзакция никогда не выполнялась. То есть успешное выполнение транзакции будет применено к базе данных, и в случае сбоя это не повлияет на базу данных.

      • последовательность:

        Целостность базы данных не нарушается ни до начала транзакции, ни после ее завершения. Например, если на счете A 1000 юаней, на счете B 100 юаней, а A переводит 500 юаней B, тогда A становится 500, а B становится 600, что означает, что перевод между ними будет в порядке, несмотря ни на что, и он будет складываются после завершения транзакции Это все 1100, это консистенция.

      • изоляция: (Это очень важно, напрямую связано с параллелизмом транзакций)

        Способность базы данных позволять нескольким параллельным транзакциям одновременно читать, записывать и изменять свои данные, а также изоляция могут предотвратить несогласованность данных из-за перекрестного выполнения, когда несколько транзакций выполняются одновременно. Изоляция транзакций делится на разные уровни, включая незафиксированное чтение (Read uncommitted), чтение зафиксированное (read commit), повторяемое чтение (repeatable read) и сериализуемое (Serializable).

      • Упорство:

        После завершения транзакции изменение данных является постоянным и не будет потеряно даже в случае сбоя системы.

    3. Сосредоточьтесь на изоляции транзакций

      Как изоляция предотвращает проблему безопасности, связанную с несогласованностью данных, вызванную перекрестным выполнением при одновременном выполнении нескольких транзакций? ответУстановив уровень изоляциирешать.

      • Четыре уровня изоляции mysql
      уровень изоляции грязное чтение неповторяемое чтение галлюцинации
      незафиксированное чтение
      Не повторяемый прочитанный (чтение) ×
      повторяемое чтение × ×
      сериализуемый × × ×
    • Среди них следует отметить, что:

      • The MVCC mechanism is used under the repeatable read isolation level. The select operation will not update the version number, but is a snapshot read (historical version); insert, update, and delete will update the version number, which is the current read ( текущая версия).所以这也会带来“脏写”问题

      • Когда уровень изоляции транзакций в mysql является сериализуемым, таблица будет заблокирована, поэтому фантомное чтение не будет.Этот уровень изоляции имеет чрезвычайно низкий параллелизм и редко используется в разработке.

    • Просмотрите текущую инструкцию уровня транзакции изоляции в mysql:select @@tx_isolation;

    • Установите оператор уровня изоляции транзакции в mysql:set tx_isolation='隔离级别名称';

      Затем, поскольку проблема несогласованности данных, вызванная параллелизмом, может быть решена путем установки уровня изоляции на последовательный, почему бы напрямую не изменить уровень изоляции базы данных наserializableХорошо? Действительно, это действительно может решить проблему несогласованности данных при параллельной обработке нескольких транзакций.Однако это часто увеличивает нагрузку на производительность, и эти потери производительности часто превышают затраты на работу с параллелизмом транзакций в сочетании с уровнями изоляции транзакций и другими механизмами параллелизма. Корректность и эффективность не могут быть достигнуты одновременно.Многие небольшие компании будут разрешать транзакции в бизнес-коде с участием денег, но на самом деле только небольшое количество компаний столкнется с высоким параллелизмом.Большинство из них просто имеют дело с параллелизмом., тогда вопрос то есть, если вы имеете дело только с небольшим количеством параллелизма, а иногда нет времени, то вам следует изменить уровень на последовательный? Нет, изменение затрагивает всю базу данных, включая все таблицы, поэтому другие запросы и изменения будут заблокированы, что крайне неэффективно.

  • Решения для управления параллелизмом баз данных

    Классификация замков

    • С точки зрения системы баз данных существует три типа: эксклюзивные блокировки (x), разделяемые блокировки (s) и блокировки обновления (u).

    • С точки зрения программиста существует два типа блокировки: один — пессимистическая блокировка, а другой — оптимистическая блокировка.

    Обсуждать только здесьпессимистический замока такжеоптимистическая блокировка

    • Пессимистический замок:

      Нужна поддержка самой базы данных, заблокируйте выбранный пакет данных с помощью оператора SQL «выбрать для обновления», всегда предполагайте наихудший случай, каждый раз, когда данные извлекаются, предполагается, что другие потоки будут изменяться, когда другие потоки захотят для доступа к данным требуется блокировка и приостановка. Пессимистический контроль параллелизма на самом деле является консервативной стратегией «сначала блокировка, а затем доступ», которая обеспечивает гарантию безопасности обработки данных. Однако с точки зрения эффективности механизм блокировки вызовет дополнительные накладные расходы на базу данных и повысит вероятность взаимоблокировок, кроме того, поскольку не будет конфликтов при обработке транзакций только для чтения, нет необходимости использовать блокировки. Это может только увеличить нагрузку на систему, а также уменьшить параллелизм.Если транзакция блокирует строку данных, другие транзакции должны дождаться завершения транзакции, прежде чем обрабатывать эту строку данных.

    • оптимистическая блокировка

      Оптимистическая блокировка, хотя в названии есть «lock», но оптимистическая блокировка ничего не блокирует, а проверяет, не была ли эта запись изменена другими транзакциями при фиксации транзакции: если нет — коммит; иначе — откат. По сравнению с пессимистической блокировкой оптимистическая блокировка не использует механизм блокировки, предоставляемый базой данных при обработке базы данных. Если вероятность параллелизма невелика, потребление производительности, связанное с оптимистичной стратегией блокировки, очень мало. Оптимистическая блокировка обычно реализуется путем записи версии данных.

      версия данныхДобавляется ли к данным идентификатор версии. При чтении данных значение идентификатора версии считывается вместе, и идентификатор версии обновляется каждый раз при обновлении данных. Когда мы отправляем обновление, сравниваем текущую информацию о версии соответствующей записи в таблице базы данных с идентификатором версии, извлеченным в первый раз.Если номер текущей версии таблицы базы данных равен значению идентификатора версии, извлеченному для в первый раз обновите его. , в противном случае он считается просроченным. Как правило, существует два способа реализации версии данных: один — использовать номер версии, другой — использовать временную метку.

  • Инструмент параллельного тестирования ab

    Это инструмент для проверки давления, который поставляется с Apache, и его также можно использовать для параллельного тестирования.

    инструкцииВведите каталог установки инструмента ab по умолчанию (обратите внимание, что это в среде Windows)

    V~J7722)6O9BS}I%)K~}1VG.png

Выполнение заказа./ab.exe -n 1000 -c 1000 http://localhost/tp5/public/

0_}27`@@E9Y1WMH8}62ERE8.png

Ниже приведен тестовый код с использованием tp5.

<?php
namespace app\index\controller;

use think\Controller;
use think\Db;

class Index extends Controller
{
    public function index()
    {
        Db::startTrans();
        try{
            $db = Db::table('test');
            $res = $db->where('id',1)->value('stock');//这样库存有可能会变负数
            //$res = $db->where('id',1)->lock(true)->value('stock');//这句解决并发带来的问题,比如库存负数
            if ($res >= 1){
                Db::table('test')->where('id', 1)->setDec('stock');
            }

            // 提交事务
            Db::commit();

        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            echo $e->getMessage();
        }
    }
}

Частично упоминается из:blog.CSDN.net/просто люблю тебя…