Всем привет, добро пожаловать в личный кабинет СяокаяsoloШкола, знания бесплатны, не стесняйтесь впитывать! Следуйте бесплатно, не стесняйтесь делать это!
Эта статья в основном знакомит
分布式事务
При необходимости вы можете обратиться к
Если это поможет, не забудьтекак❥
Официальный аккаунт WeChat открыт,Хорошая еда, студенты, которые не обратили внимания, не забудьте обратить внимание!
生活可能对你耍无赖,但科技不能
Я пошел в лавку что-то купить, заплатил деньги, начальник развернулся и взял сигарету, но забыл, что я заплатил? Как это сделать, неудивительно, что это происходит и в повседневной жизни. Но вы делаете заказ онлайн, платите деньги и просто хотите проверить заказ, а он предлагает вам оплатить, и вы не знаете, прошли ли мимо десятки тысяч траво-грязных лошадей! Поэтому, чтобы этого не произошло, особенно важными стали распределенные транзакции.
Некоторые люди задаются вопросом, а какое отношение платить или не платить к распределенным транзакциям, не мошенническая ли это программа? Но за мошенником стоит то, что работают распределенные транзакции! Если вы все еще не понимаете, то, возможно, вы не понимаете, что такое транзакция и что такое распределенная транзакция~
Распределенная транзакция
определение
Транзакции предоставляют механизм для включения всех операций, участвующих в операции, в неделимую исполнительную единицу. Все операции, составляющие транзакцию, могут быть зафиксированы только в том случае, если операции выполняются нормально. Если какая-либо из операций завершается сбоем, это вызывает откат всей сделки. Проще говоря,要么做,要么不做
.
звучит немногоman
, не зацикливайтесь, давайте сначала разберемся с четырьмя характеристиками дел:ACID
- А (атомный): Атомарность, все операции, составляющие вещь, либо все выполняются, либо не выполняются, и не может быть какого-то успеха и каких-то неудач.
- С (Консистенция): Согласованность, ограничения согласованности базы данных не нарушаются до и после выполнения транзакции. Как только все действия транзакции завершены, транзакция фиксируется, а данные и ресурсы находятся в согласованном состоянии, которое удовлетворяет бизнес-правилам. Например, как было сказано выше, я заплатил владельцу магазина, моя сторона вычла 100, а владелец добавил 100. Это называется последовательность.
- Я (Изоляция): Изоляция. Транзакции в базе данных, как правило, параллельны. Изоляция означает, что две параллельные транзакции не мешают друг другу. Одна транзакция не может видеть промежуточное состояние запущенного процесса других транзакций. Путем настройки уровня изоляции транзакций грязные чтения могут быть избегать. , фантомное чтение, неповторяемое чтение и т.д.
- Д (Прочность): Сохранение, после завершения транзакции изменения данных транзакцией будут сохранены в базе данных и не будут откатываться.
одна транзакция
В первые дни мы все еще использовали единую структуру, как большая семья, счастливо живя вместе днем и ночью.
Со временем естественно появились различные проблемы:复杂性高,部署频率低,可靠性差,扩展能力受限...
Натерпев слишком много сплетен, которые терпеть не стоит, а все постепенно ищут новый выход, должна появиться и микросервисная архитектура:易于开发、扩展、理解和维护,不会受限于任何技术栈,易于和第三方应用系统集成...
Преимуществ слишком много, так что монолитная система постепенно исчезает из поля зрения людей.Похоже, что если сейчас не использовать микросервисную архитектуру для разработки проектов, то потеряешь связь с обществом.Плюсов много, но проблема усложнится. В этом разделе мы не будем говорить ни о чем другом, давайте посмотрим, что такое распределенные транзакции.
Транзакции, безусловно, существуют как в монолитах, так и в микросервисах, но вмономерВ архитектуре, как мы обычно решаем транзакцию?@Transactional
, только эта аннотация может открыть транзакцию, чтобы обеспечить всю операцию原子性
.
Распределенная транзакция
Архитектура микросервиса на самом деле состоит в том, чтобы разделить традиционный мономер на несколько сервисов, а затем несколько сервисов взаимодействуют друг с другом для выполнения бизнес-требований.
Распределенная транзакция относится к участникам транзакции, сервер, поддерживающий транзакцию, ресурсный сервер и менеджер транзакций расположены на разных узлах разных распределенных систем.
Теперь, когда мы говорим о распределенных транзакциях, давайте взглянем на микросервисы.теория CAP
- С (Консистенция):последовательность. Все три узла службы A, B и C хранят пользовательские данные, и данные трех узлов должны одновременно поддерживать согласованность данных.
- А (доступность): Доступность. Есть три узла, обслуживающих A, B и C. Если один из узлов выходит из строя, это не может повлиять на внешний сервис, предоставляемый всем кластером.
- P (допуск перегородки): Отказоустойчивость разделов позволяет системе работать вместе через сеть Отказоустойчивость разделов должна решать проблемы неполных и недоступных данных, вызванные сетевыми разделами.
Мы все знаем, что нельзя есть и рыбу, и медвежью лапу, и нельзя есть и то, и другое!CAPВ настоящее время невозможно иметь и то, и другое, поэтому в текущей стратегии микросервиса либоCA
, илиCP
, или иначеAP
. В это время появилась другая теория, т.БАЗОВАЯ теория. он используется длятеория CAPС некоторыми дополнениями оно того стоит:
- BA (в основном доступно): в основном доступно
- S (мягкое состояние): мягкое состояние
- E (в конечном счете согласованный): возможная согласованность
Основная идея этой теории заключается в следующем: если мы можем добиться строгой согласованности, то каждое приложение должно принять соответствующий метод, чтобы система достигла окончательной согласованности в соответствии с ее собственными бизнес-характеристиками.
Сцена появляется
Вернемся к распределенным транзакциям, когда будут происходить распределенные транзакции?
Сцена 1:Хотя это сервис с единой архитектурой, он все равно будет приводить к распределенным транзакциям в случае с подбиблиотеками, поэтому не будет такого утверждения, как распределенные транзакции в отдельных сервисах.ломать~
Сценарий 2:В распределенной архитектуре две службы вызывают друг друга, и хотя используется одна и та же база данных, распределенные транзакции все же происходят. Кто сказал вам использовать распределенную архитектуру~
Сценарий 3:При распределенной архитектуре два сервиса звонят друг другу и используют разные базы данных, в этом случае точно возникнет проблема распределенных транзакций, даже не думайте об этом!
Решение
Там, где есть проблема, будет и решение, конечно не обязательно, но здесь действительно есть решение проблемы распределенных транзакций.Если нет, Xiaocai не будет писать эту статью, чтобы напроситься на неприятности!
Способ 1: глобальная транзакция
Я не знаю, что сказать здесьглобальная транзакциясделает вас более знакомым, илиДвухэтапная фиксация (2PC)Это сделает вас более знакомыми, или вы не знакомы с этим ~ Неважно, если вы не знакомы, Xiaocai познакомит вас с этим!
Глобальные транзакции реализованы на основе модели DTP, в которой указано, что для реализации распределенных транзакций требуются три роли:
- АП (приложение): Система приложений (микросервис)
- ТМ (менеджер транзакций): Менеджер транзакций (глобальное управление транзакциями)
- RM (менеджер ресурсов): Менеджер ресурсов (база данных)
КромеAPВ этой роли мы знаем больше о двух других одноклассниках, которые事务管理器
и资源管理器
, то какую роль они играют, то мы должны посмотреть какие два этапа это двухэтапный коммит!
Фаза 1: Фаза голосования
Все участники предварительно совершают свои собственные транзакции и сообщают информацию о своем успехе координатору.
- Менеджер транзакций отправляет
prepare
Инструкции для двух серверов A и B - После того, как два сервера A и B получат сообщение, они решают, могут ли они отправить транзакцию в соответствии со своей ситуацией.
- Зафиксировать результат обработки в диспетчере ресурсов
- Вернуть результат обработки менеджеру транзакций
Фаза 2: Фаза выполнения
Координатор уведомляет всех участников в соответствии с отзывами всех участников и выполняет фиксацию или откат в унисон.
- Менеджер транзакций отправляет инструкцию фиксации на оба сервера A и B.
- После того, как два сервера A и B получат инструкции, они отправят свои собственные транзакции.
- Запишите результат обработки в диспетчер ресурсов
- Вернуть результат обработки менеджеру транзакций
Это общий процесс двухэтапной фиксации, который повышает вероятность согласованности данных и снижает стоимость реализации. Но недостатки этой реализации тоже очевидны!
- единая точка отказа: в случае сбоя диспетчера транзакций вся система будет недоступна.
- синхронная блокировка: задерживает отправку событий, удлиняет события блокировки ресурсов и не подходит для сценариев с высоким параллелизмом.
- несогласованность данных: Если он выполняется до второго этапа, он все еще существуетcommitКогда результат неизвестен, его получают только некоторые участникиcommitЧасть сообщений не была получена, и только некоторые участники отправили транзакции, что все равно приведет к несоответствию данных.
Способ 2: трехэтапная фиксация
Поскольку двухэтапная фиксация не может решить проблему, давайте перейдем к трехфазной фиксации. Трехэтапная фиксация увеличивается по сравнению с двухфазной фиксациейConCommit
Механизм фазы и тайм-аута. Если участники сервера не получают выполнение фиксации от диспетчера транзакций в течение заданного периода времени, они автоматически фиксируют себя, тем самым решая проблему двухэтапного одиночного отказа.
Давайте посмотрим, какие три этапа трехфазного коммита:
-
CanCommit:подготовительный этап. Что делать на этом этапе так же, как и на двухэтапном коммите.Во-первых, спросите участников, могут ли они принять транзакцию условно, чтобы она не была слишком насильственной, и поработайте непосредственно над блокировкой ресурсов в начале.
-
PreCommit: На этом этапе менеджер транзакций отправляет каждому участнику готовый к отправке запрос.Каждый участник получает запрос или записывает результат обработки в свой собственный менеджер ресурсов.Если они готовы, они дают обратную связь координатору.
ACK
Указывает, что я готов представить. -
DoCommit: Это чтобы остановить отсостояние перед фиксациейПреобразовать вОтправитьгосударство. Менеджер транзакций отправляет сообщение каждому участникуОтправитьЗапрос, после того как участники получат запрос, каждый из них выполнит операцию фиксации своей транзакции. Запишите результаты обработки в собственный менеджер ресурсов и дайте обратную связь координатору
ACK
Указывает на то, что транзакция завершена, если ее не завершил один участникPreCommitЕсли обратная связь или время обратной связи истекло, координатор отправит запрос на прерывание всем участвующим узлам, тем самым прервав транзакцию.
На самом деле трехэтапный коммит выглядит как двухэтапный коммит.提交阶段
сталпредварительная стадияиэтап фиксации.
На самом деле из вышеизложенного видно, что трехэтапный коммит решает только двухэтапный коммит.единичный отказПроблема в том, что добавлен механизм тайм-аута, механизм тайм-аута здесь используется дляпредварительная стадияиэтап фиксации. если ждатьпредварительно отправить запросПри превышении тайм-аута участник приравнивается к тому, что ничего не говорит и возвращается сразу к этапу подготовки. если ты подождешьОтправить запросЕсли тайм-аут истекает, участник фиксирует транзакцию.
Таким образом, видно, что трехэтапная подача принципиально не решила проблему, хотя и немного лучше, чем двухэтапная ~
Способ 3: ТСС
TCC (Попробуйте Подтвердить Отмена), которая является компенсационной распределенной транзакцией. Его основная идея заключается вДля каждой операции регистрируется соответствующая операция подтверждения и компенсации (отмены).. В TCC есть три шага для реализации распределенных транзакций:
- Try: попробовать дело, которое нужно выполнить
Этот процесс не выполняет бизнес, просто завершает проверку согласованности всего бизнеса исдержанныйВсе ресурсы, необходимые для хорошего исполнения
- Confirm: Подтвердить выполнение дела
Подтвердите операцию выполнения бизнеса, не выполняйте никаких бизнес-проверок и используйте только бизнес-ресурсы, зарезервированные на этапе пробной версии. При нормальных обстоятельствах использование TCC будет считать этап подтверждения безошибочным. Пока Try завершается успешно, Confirm должен выполняться успешно. Если подтверждение ошибочно, вам необходимо ввести механизм повторных попыток или ручную обработку.
- Cancel: Отменить незавершенное дело
Отмените бизнес-ресурсы, зарезервированные на пробном этапе. При нормальных обстоятельствах, если TCC принят, считается, что этап отмены будет успешным.Если этап отмены действительно ошибочен, следует также ввести механизм повторных попыток или ручную обработку.
TCCЭто распределенная транзакция на бизнес-уровне с окончательной согласованностью, которая не всегда удерживает блокировки ресурсов. Его преимущества и недостатки заключаются в следующем:
преимущество:В представлении уровня базы данных на втором этапе упоминается, что реализован прикладной уровень, что позволяет избежать проблемы низкой производительности 2PC базы данных.
недостаток: функции TCC Try, Confirm и Cancel должны быть предоставлены бизнесом, а стоимость разработки высока. TCC более навязчива для бизнеса и тесно связана с бизнесом, и соответствующие операции должны быть разработаны в соответствии с конкретными сценариями и бизнес-логикой.
Метод 5: Надежные транзакции сообщений
Принцип обмена сообщениямиАсинхронное разделение двух транзакций с помощью промежуточного программного обеспечения сообщений. Решение, основанное на надежной службе сообщений, заключается в обеспечении согласованности операций с данными между вышестоящими и нижестоящими приложениями с помощью промежуточного программного обеспечения сообщений. Предполагая, что есть две службы A и B, дистрибутив может обрабатывать две задачи A и B. В это время должен быть бизнес-процесс, чтобы поместить задачи A и B в одно и то же для обработки. Таким образом, промежуточное программное обеспечение сообщений можно использовать для выполнения.
В целом его можно разделить на два основных этапа:A服务向消息中间件发布消息
и消息向B服务投递消息
шаг первый:Служба публикует сообщения в ПО промежуточного слоя сообщений
- Перед тем, как служба A обработает задачу A, она сначала отправляет полусообщение промежуточному программному обеспечению сообщений.
- ПО промежуточного слоя сообщений сохраняет сообщение после его получения, но не доставляет его. После успешного сохранения в службу A возвращается подтверждающий ответ.
- После того, как служба A получит ответ с подтверждением, она может начать обработку задачи A.
- После завершения обработки задачи A сервис A отправит запрос Commit или Rollback в мидлвар сообщения, после отправки запроса рабочая задача сервиса A завершится, а также завершится обработка транзакции.
- Получено в промежуточном программном обеспечении сообщенийCommitПосле того, как сообщение доставлено службе B, если оно получаетRollbackсообщение будет удалено напрямую
Если промежуточное программное обеспечение сообщений не получает сообщение, отправленное службой A, в течение длительного времени в финальном процессеCommitилиRollbackинструкции, на этот раз вам нужно полагаться наМеханизм запроса тайм-аута
Механизм запроса тайм-аута:
В дополнение к реализации обычных бизнес-процессов служба A также должна предоставлять интерфейс, к которому можно обращаться с помощью транзакций промежуточного программного обеспечения сообщений. После того, как промежуточное программное обеспечение сообщений получит сообщение в первый раз, оно начнет отсчет времени.Если последующие инструкции не будут получены после указанного времени, оно будет активно вызывать интерфейс запроса транзакции, предоставляемый службой А, чтобы узнать о состоянии текущей службы. Вообще говоря, интерфейс будет возвращать три вида результатов, и промежуточное ПО должно выполнять различную обработку в соответствии с этими тремя разными результатами:
- Отправить: доставить сообщение непосредственно в службу B
- Откат: удалить сообщение напрямую
- Обработка: продолжаем ждать, переназначаем время
Шаг 2:Промежуточное программное обеспечение сообщений доставляет сообщение службе B.
Промежуточное программное обеспечение сообщений получает отправку службы A.CommitПосле инструкции сообщение будет доставлено службе B, а затем его собственное состояние будет установлено в состояние ожидания блокировки. Служба B начинает обрабатывать задачу B после получения сообщения, отправленного промежуточным программным обеспечением сообщений, и отправляет ответ промежуточному программному обеспечению сообщений после завершения обработки. Но также будут проблемы, когда промежуточное ПО сообщений блокируется и ждет.
- Нормальная ситуация: после того, как промежуточное программное обеспечение сообщений доставило сообщение, оно переходит в состояние ожидания блокировки.После получения подтверждающего ответа обработка транзакции считается завершенной, и процесс завершается.
- Ожидание тайм-аута: после ожидания тайм-аута ответа на подтверждение доставка будет повторно доставлена до тех пор, пока сервер B не вернет ответ об успешном потреблении. Можно настроить количество и временной интервал повторных попыток отправки сообщения.Если доставка по-прежнему не удалась, требуется ручное вмешательство.
Реализована надежная схема обслуживания сообщенийокончательная согласованность. По сравнению со схемой реализации локальной таблицы сообщений нет необходимости создавать таблицу сообщений.Не полагайтесь на транзакции локальной базы данных, который подходит для сценариев с высокой степенью параллелизма.RocketMQОн очень хорошо поддерживает транзакции сообщений.
Метод 4: Уведомление о лучших усилиях
Уведомления о максимальных усилиях также становятся регулярной проверкой, что является еще одной оптимизацией надежной службы обмена сообщениями. Он вводит локальную таблицу сообщений для записи сообщений об ошибках, а затем добавляет периодическую корректуру ошибочных сообщений, чтобы еще больше гарантировать, что сообщения будут использоваться нижестоящими службами.
Так же, как и транзакцию сообщения, можно разделить на два этапа:
шаг первый:Служба A отправляет сообщение промежуточному программному обеспечению сообщений
- Запишите запись в локальную таблицу сообщений в той же транзакции, которая обрабатывает бизнес.
- Отправитель сообщения продолжает извлекать сообщения из локальной таблицы сообщений и отправлять их промежуточному программному обеспечению сообщений и повторять попытку, если отправка не удалась.
Шаг 2:Промежуточное программное обеспечение сообщений доставляет сообщение службе B.
- После того, как промежуточное программное обеспечение сообщений получит сообщение, оно доставит сообщение нижестоящей службе B, а служба B выполнит свои собственные дела после получения сообщения.
- Когда бизнес службы B будет успешно обработан, он вернет ответ обратной связи промежуточному программному обеспечению сообщений, и промежуточное программное обеспечение сообщений может удалить сообщение, и процесс завершится.
- Если промежуточному программному обеспечению сообщений не удается доставить сообщение службе B, оно попытается повторить попытку, а если повторная попытка завершится неудачно, оно добавит сообщение в таблицу сообщений с ошибками.
- Промежуточное программное обеспечение сообщений также должно предоставлять интерфейс для запроса сообщений об ошибках.Служба B регулярно запрашивает информацию об ошибках и использует ее.
Реализация схемы уведомления с наилучшими усилиями относительно проста и подходит для некоторых служб с низкими требованиями к согласованности в конечном итоге.
Seata
Концепт Сеата
Поскольку распределенные транзакции настолько сложны в обработке, можем ли мы сделать распределенные транзакции такими же простыми, как локальные транзакции? Конечно, это наше видение. Конечно, это видение — то, чего хотят все разработчики. Команда Alibaba приняла меры для реализации этого видения и запустила проект с открытым исходным кодом.Seata (простая расширяемая архитектура автономных транзакций). Это набор решений для распределенных транзакций, предназначенных для решения всех аспектов проблем распределенных транзакций, с которыми сталкиваются разработчики.
SeataЦель разработки состоит в том, чтобы быть ненавязчивой для бизнеса, поэтому она начинается с ненавязчивой двухфазной фиксации (глобальной транзакции) бизнеса и совершенствуется по сравнению с традиционной двухфазной.Он понимает распределенную транзакцию как транзакцию. который содержит несколько ветвей глобальных дел. Глобальная транзакция отвечает за координацию транзакций ветвей, которыми она управляет, для достижения согласованности, либо для успешной совместной фиксации, либо для сбоя и совместного отката. То есть один процветает, а другой теряется.
Состав Seata
ПосмотримSeataЕсть несколько важных ролей в:
- TC (координатор сделки): Координатор транзакций. Управляет состоянием транзакций глобальных ветвей для фиксации и отката глобальных транзакций.
- ТМ (менеджер транзакций): менеджер транзакций. Используется для открытия, фиксации или отката транзакций.
- RM (менеджер ресурсов): Менеджер ресурсов. Используется для управления ресурсами в транзакциях филиала, чтобыTCЗарегистрировать транзакцию филиала, сообщить о состоянии транзакции филиала, получитьTCкоманда для фиксации или отката транзакций ветвления.
Это очень умный дизайн, давайте посмотрим на картинку:
Последовательность выполнения следующая:
- в службе АTMВ направленииTCподать заявку на открытие глобальной транзакции,TCсоздаст глобальную транзакцию и вернет уникальныйXID
- в службе АRMВ направленииTCЗарегистрируйте транзакцию филиала, затем включите эту транзакцию филиала вXIDСоответствующие глобальные дела находятся в ведении
- Служба A начинает выполнять транзакцию филиала
- Служба A начинает удаленно вызывать службу B, в это времяXIDбудет распространяться в соответствии с цепочкой вызовов
- на службе БRMтакже кTCЗарегистрируйте транзакцию филиала, затем включите эту транзакцию филиала вXIDСоответствующие глобальные дела находятся в ведении
- Сервис B начинает выполнять транзакцию филиала
- После обработки вызова глобальной транзакцииTMВ соответствии с ненормальной ситуацией ошибки, он будет отправлен наTCИнициировать фиксацию или откат глобальной транзакции
- TCКоординация всех транзакций филиала под его юрисдикцией и принятие решения о фиксации или откате
Использование Seata
О составе и процессе исполнения Seata мы узнали из вышеизложенного, и дальше будем использовать его на практике.Seata.
демо
Мы просто создали микросервисный проект с сервисом заказов и сервисом инвентаризации.
Здесь мы используемnacosВ качестве реестра запускаем соответственно две службы, находимся вnacosКонсоль может видеть две зарегистрированные службы:
Дополнительно: если даnacosНезнакомые друзья могут перейти к просмотруобъяснение нако:Новичок в микросервисах Nacos
Затем мы создали базу данных с двумя таблицами:c_order
иc_product
, в таблице товаров есть часть данных, а в таблице заказов данных нет, дальше будем оперировать!
Теперь смоделируем процесс размещения заказа:
- Запросы приходят через товарыpidПроверьте информацию о продукте в базе данных
- Создать заказ на этот товар
- Соответственно вычесть инвентарь продукта
- Процесс заканчивается
Давайте перейдем к коду, чтобы продемонстрировать:
Примечание. Здесь ProductService — это не класс службы инвентаризации, а интерфейс, который использует Feign для удаленного вызова службы инвентаризации.
Код состоит из трех шагов, и при нормальных обстоятельствах проблем точно не возникает:
Когда заказ сгенерирован, инвентарь также соответственно уменьшается.Когда вы чувствуете, что ваш код может выйти в онлайн и встать на правильный путь, давайте смоделируем аномалию в инвентаре.Количество предметов инвентаря классифицируется как100, таблица заказов очищается:
Мы продолжаем отправлять запрос на заказ и видим, что служба инвентаризации выдала исключение.
Обычно в это время количество таблиц инвентаризации не должно уменьшаться, а данные заказа не должны вставляться в таблицу заказов, но так ли это на самом деле? Посмотрим на данные:
Запасы не уменьшились, а заказы увеличились. Ну вот, вы увидели катастрофический вред распределенных транзакций. Главный герой идет дальше!
Установка сеата
Сначала нам нужно нажатьссылка для скачиванияСкачатьSeata.
Поскольку мы используемnacosКак сервисный центр и центр конфигурации, нам необходимо внести некоторые изменения после загрузки и распаковки
- Входить
conf
Редактирование каталогаregistry.conf
иfile.conf
Два файла редактируются следующим образом:
- Из-за новой версииSeataНет в
nacos-conf.sh
иconfig.txt
Два файла, поэтому нам нужно скачать их самостоятельно:
нам надоconfig.txt
файл вseataкаталог вместоconfкаталог, и его необходимо изменитьconfig.txt
содержание
config.txt
Это подробная конфигурация сиденья, выполнитьnacos-config.sh
чтобы импортировать эти конфигурации вnacos, так что не надоfile.conf
иregistry.conf
Ставим его в наш проект, а какая конфигурация нужна прямо изnacosчитать в.
- выполнить импорт
существуетconfОткройте окно git bash в каталоге и выполните следующую команду:
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t namespace-id(需要替换) -u nacos -w nacos
После окончания операции мы можемnacosВы можете увидеть список конфигурации в консоли.Если вам нужно изменить конфигурацию в будущем, вы можете изменить ее прямо отсюда, не изменяя файл каталога:
- Конфигурация базы данных
существует1.4.1В последней версии по-прежнему нет sql-файла, поэтому нам все равно нужно скачать его отдельно:адрес загрузки sql
существуетseataВыполните этот файл в данных, чтобы сгенерировать три таблицы:
Выполнить в нашей бизнес-базе данныхundo_logЭтот стол:
CREATE TABLE `undo_log`
(
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`branch_id` BIGINT(20) NOT NULL,
`xid` VARCHAR(100) NOT NULL,
`context` VARCHAR(128) NOT NULL,
`rollback_info` LONGBLOB NOT NULL,
`log_status` INT(11) NOT NULL,
`log_created` DATETIME NOT NULL,
`log_modified` DATETIME NOT NULL,
`ext` VARCHAR(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = INNODB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8;
- добавить файл журнала
Если у нас нет выходного файла журнала, запуститеseataможет сообщить об ошибке, поэтому нам нужноseataСоздано в каталогеlogsпапка, созданная под лог-файломseata_gc.log
документ
- запускать
Имея вышеперечисленные приготовления, мы можем начатьseata, прямо вbinВыполнить cmd в каталогеbatСкрипта достаточно, и запуск можно завершить заnacosвидеть вseataСлужить:
Интеграция Seata
На этапах установки Seata мы закончилиСеата серверНачальная установка, следующий шаг — интеграция в проектКлиент Seata
- Шаг 1: Нам нужноpom.xmlДобавьте в файл две зависимости:
seata 依赖
иnacos 配置依赖
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--seata-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<!-- 排除依赖 指定版本和服务器端一致 -->
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
</exclusion>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.4.1</version>
</dependency>
Уведомление:тут надо исключитьspring-cloud-starter-alibaba-seata
автономныйseataЗависимость, а затем ввести то, что нам нужноseataверсия, если версия несовместима, это может привести кno available server to connect
Ошибка!
- Шаг 2: Нам нужно поставить
restry.conf
Скопируйте файл в каталог ресурсов проекта
- Шаг 3: Вам нужно настроить его самостоятельноseataпрокси источник данных
@Configuration
public class DataSourceProxyConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DruidDataSource druidDataSource() {
return new DruidDataSource();
}
@Primary
@Bean
public DataSourceProxy dataSource(DruidDataSource druidDataSource) {
return new DataSourceProxy(druidDataSource);
}
}
После настройки источника данных мы должны запустить классSpringBootApplication
Исключите зависимость источника данных Druid от вышеперечисленного, иначе может возникнуть циклическая ошибка зависимости:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
- Шаг 4: вnacosДобавьте элемент группы транзакций нашего сервиса в консоль конфигурационного файла:
service.vgroupMapping + 服务名称 = default
group为: SEATA_GROUP
- Шаг 5: Изменение конфигурации в проекте
- Шаг 6: Откройте глобальную транзакцию
Этот шаг является последним, добавьте метод, который нам нужен для открытия транзакции.@GlobalTransactional
Аннотации, аналогичные добавленным нашей одиночной транзакцией@Transactional
Тест Сеата
Теперь вернемся к проекту.В приведенном выше примере демонстрации мы уже знаем, что если служба инвентаризации работает ненормально, то произойдет то, что инвентарь не будет уменьшен, а заказ все равно будет сформирован. Тогда, если мы добавимSeataуправлять глобальными делами, изменится ли ситуация? Тестируем следующим образом:
Служба инвентаризации имеет исключение:
Взгляните на данные базы данных:
Похоже, наша глобальная транзакция вступила в силу, и транзакция полностью контролируется!
и мы создалиundo_logЭта таблица также играет важную роль в управлении транзакциями:
После прочтения вышеперечисленных операций, давайте ковать железо, пока горячо, чтобы разобраться в процессе выполнения, чтобы вы могли быть более впечатлены ~
Я считаю, что после прочтения этой картины вы правыSeataПроцесс выполнения транзакций также стал более привычным!
На этом еще не все, давайте перейдем к некоторым основным моментам:
- каждыйRMнужно использоватьDataSourceProxyПодключиться к базе данных, это использоватьConnectionProxy, целью использования источника данных и прокси-сервера для подключения к данным являетсяundo_logи бизнес-данные передаются в локальной транзакции, поэтому, пока есть бизнес-операции, должны бытьundo_logпроизводить!
- на первом этапеundo_logВ нем хранятся значения до и после модификации данных, чтобы подготовиться к откату транзакции, поэтому транзакция ветки была зафиксирована на первом этапе, и ресурсы блокировки освобождены!
- TMПосле включения глобальной транзакцииXIDв контексте глобальной транзакции мы передаемfeignвызов такжеXIDВ нижестоящую службу каждая транзакция филиала будет отправлять свои собственныеBranch IDиXIDСвязано!
- На втором этапе, если глобальная транзакция зафиксирована нормально, тоTCКаждый участник филиала будет уведомлен о необходимости отправить транзакцию филиала, и каждому участнику нужно будет только удалить соответствующийundo_logВот и все, и его можно выполнять асинхронно!
- На втором этапе, если глобальную транзакцию необходимо откатить, тоTCКаждый участник транзакции филиала будет уведомлен об откате транзакции филиала путемXIDиBranch IDнайти соответствующийundo_loglog, сгенерируйте реверс, откатив журналSQLИ выполнить, завершить состояние до того, как транзакция будет зафиксирована, если откат не удался, операция отката будет повторена!
END
На этом распределенная транзакция завершена. Давайте рассмотрим от пяти решений распределенных транзакций до выводаSeataXiaocai действительно из лучших побуждений, чтобы использовать его ~ Давайте приступим к делу, сколько я впитал после его прочтения, шевелите своими ручонками, пишите код и делайте знания ближе к вам ~
Если вы будете усердно работать сегодня, завтра вы сможете сказать на одну вещь меньше, чтобы попросить о помощи!
Я Сяо Цай, человек, который учится у вас.
💋
Официальный аккаунт WeChat открыт,Хорошая еда, студенты, которые не обратили внимания, не забудьте обратить внимание!