[Фэй Чао] Давайте поговорим о том, что следует понимать из устранения неполадок.

Java программист
[Фэй Чао] Давайте поговорим о том, что следует понимать из устранения неполадок.

предисловие

В прошлую пятницу коллега столкнулся с проблемой во время разработки и попросил меня взглянуть.Прежде чем описать проблему, с которой столкнулся этот коллега, я кратко заложу основу для некоторых знаний, иначе это будет сложно описать.Здесь задействованы точки знаний. имеютSpring的事务传播机制,数据库的隔离级别Ждать.

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

Механизм распространения транзакций Spring

В Sring есть семь механизмов распространения транзакций, два из которых рассматриваются в этой статье.

REQUIRED: используется чаще всего (по оценкам, до 90%), а также является режимом по умолчанию.Если текущей транзакции нет, создается новая транзакция, а если транзакция в настоящее время существует, она добавляется в транзакцию.

REQUIRES_NEW: создать новую транзакцию

Механизм распространения транзакций Spring Я буду использовать статью, чтобы поговорить об этом позже, чтобы перечислить для вас различные типичные типы вопросов и полностью понять механизм передачи Spring в соответствии с режимом обучения типа вопроса в средней школе, даже в различных复杂嵌套 + tryСитуацию отката тоже можно легко определить в сцене.В том числе очень классический вопрос интервью перед разбором

  • Выполнить 51 операцию, первые 50 успешны, 51-я не удалась, все откатиться
  • Выполните 51 операцию, первые 50 раз успешны, 51-й раз не работает, только 51-й раз откатывается, а полные 50 раз отправляются как обычно

уровень изоляции транзакций

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

1.Read Uncommitted: читать без фиксации

Это в принципе невозможно использовать. Вы знаете это буквально. Когда вы читаете данные, которые другие еще не отправили, как вы узнаете, отправят ли другие или откатятся дальше? Поскольку вы не знаете, что изучаете, естественно, будет быть вопросом. Этот вопрос мы называем脏读.

2.Serializable: сериализовать

На самом деле это синхронизация, производительность слишком низкая, использовать это в принципе невозможно, но это единственное решение.幻读под вопросом.

анализ чертежей

Осталось два уровня изоляции

  • Read Committed: чтение зафиксировано

  • Read Repeatable: повторяемое чтение

Важнее, рисуем картинку для анализа

Как я спрашиваю, когдаt4Когда данные запроса, имя大肥朝все ещеtobyНа самом деле, ты не очень уверен в своем сердце, но если я поставлю提交事务Эти слова выделены жирным шрифтом и отмечены красным, а затем соблазняют их.Большинство студентов根本把持不住!!!

так как оба提交事务Ну, это читается естественноtobyЛа.

фактическиt4прочитай этоtobyвсе еще大肥朝Это зависит от того, что вы используете读已提交,可重复读.На самом деле можно догадаться по китайскому названию, если оно读已提交, то обнаруживается, чтоtoby.если可重复读, естественно читать大肥朝. MySQLПо умолчанию используется可重复读.OracleПо умолчанию используется读已提交.

Напоминание: вы также можете рассмотреть возможность написания другой статьи, чтобы подробно рассказать об этом уровне изоляции позже, потому что его часто спрашивают.可重复读, глубинный интервьюер будет продолжать спрашивать, как достигается повторяемость чтения?Мы можем сначала обратить внимание на официальный аккаунт Фейчао, а потом подробно рассказать о базе данных.MVCCмеханизм

описание проблемы

Так как бизнес имеет определенную сложность, он не способствует всеобщему просмотру, поэтому здесь я намеренно абстрагировался и упростил модель.

Во-первых, я сначала изменил уровень изоляции базы данных на读已提交.Скриншот для доказательства:

Итак, вопрос в том, какие данные запрашиваются на шаге 3. Давайте посмотрим вместе.

Свидетель ответа

1. После запроса данных подготовьтесь к обновлению данных

2. После завершения обновления и фиксации транзакции мы видим, что база данных была изменена наtoby

3. В шоке!Узнанные данные оказались大肥朝

В настоящее время это не кажется добрым, то, что Фэй Чао сказал перед тобой, ты сказал перед собой读已提交Прочитайте, если кто-то еще представил, то это должно бытьtobyПравильно, почему до сих пор大肥朝?.

начать расследование

Ставим конфигурационный файл на `debug level и все понятно

logging.level.com.toby.demo.dao=debug
logging.level.org.mybatis=debug

Здесь я намеренно использую разные цвета, чтобы обозначить это ясно для всех, на самом деле я вижу, что это выводится только дваждыSQLЖурнал всем известен.Третий запрос не выводит SQL, который явно используетсяMybatisЗакешировал.Тогда по тому что я отметилSqlSessionС информационной точки зрения, вот использованиеMybatisиз一级缓存

Решение

Есть много решений, мы знаем, что объем кеша первого уровня MybatisSqlSession, то до тех пор, пока два запроса различныSqlSessionТогда, естественно, кеш первого уровня недействителен. Кэш первого уровня недействителен. Он будет дважды запрашивать и дважды выводить sql. На этот разtobyвсе еще大肥朝Это действительно зависит от того, что я сказал ранее隔离级别Например, простая модификация

Способов изменения законодательства много, и достаточно отталкиваться от конкретного бизнеса.Конечно, можно использовать и вышеуказанный вид.

напиши в конце

Feichao — это технический публичный аккаунт, в котором основное внимание уделяется принципам, исходному коду и навыкам разработки, оригинальному тематическому анализу исходного кода в аккаунте и реальному сражению принципов исходного кода в реальных сценах (ключевые моменты).Отсканируйте QR-код нижеОбратите внимание на Фей Чао, пусть те, кто должен строить ракеты, перестанут трахаться!