Основным исследованием в этой статье являются введение и примеры уровня изоляции пружинных транзакций, следующим образом.
Когда две транзакции работают в записях в одной базе данных, какое влияние между ними? Это поднимает концепцию уровня изоляции транзакций. Изоляция базы данных имеет многое отношение к управлению параллелизмом. Уровень выделения базы данных является частью кислоты транзакционной характеристики базы данных. Кислота, то есть атомичность, консистенция, изоляция и долговечность. Spring имеет четыре уровня изоляции транзакций: READ_UNCOMMITTED , READ_COMMITTED , REPEATABLE_READ и SERIALIZABLE . Другим является уровень изоляции по умолчанию DEFAULT базы данных, а MySQL по умолчанию на REPEATABLE_READ .
Давайте подробно рассмотрим это ниже.
Как следует из названия, READ_UNCOMMITTED означает, что одна транзакция может считывать записи транзакций, что другая транзакция не была совершена. Другими словами, транзакция может считывать данные, которые все еще запрещены другими транзакциями. Это самый слабый уровень изоляции для весенних транзакций. См. Рисунок ниже, транзакция A включена и записывается запись. В настоящее время транзакция B считывает данные и считывает эту запись, но затем транзакция откидывает. Следовательно, данные, считываемые транзакцией B, недопустимы (база данных находится в неверном состоянии). Эта ситуация называется грязной чтением. В дополнение к проблеме грязного чтения, READ_UNCOMMITTED также может иметь non-repeatable read (не повторяющееся чтение) и phantom read (Phantom Reading).
Уровень изоляции READ_COMMITTED указывает, что транзакция может считывать только совершенные записи и не может прочитать незавершенные записи. Другими словами, транзакция может только читать преданные данные, и она не может прочитать незавершенные данные. Поэтому ситуация с грязной чтением больше не происходит, но могут возникнуть другие проблемы. Смотрите изображение ниже.
Между двумя чтениями транзакции A транзакция B модифицирует эту запись и обменивает ее. Следовательно, записи, прочитанные до и после транзакции, являются непоследовательными. Эта проблема называется неповторимым чтением (не может быть прочитано неоднократно). (Записи читаются непоследовательно между двумя разами, и повторные показания найдут проблемы.)
В дополнение к незадачной задаче чтения, READ_COMMITTED также может иметь проблему с призрачной чтением.
Repectable_read означает, что транзакция может читать запись из базы данных несколько раз, а запись записи несколько раз одинакова, одинакова. Этот уровень изоляции может избежать проблемы грязного чтения и незадачного чтения, но проблема призрачного чтения может возникнуть. Как показано на рисунке ниже.
Транзакция A читает серию записей из базы данных дважды, в течение которой транзакция B вводит запись и представляет ее. Когда транзакция A читается во второй раз, запись о том, что транзакция B была только что вставлена, будет прочитана. Во время транзакции серия записей, прочитанных транзакцией, дважды непоследовательна, и эта проблема называется Phantom Read.
Serializable - это самый сильный уровень изоляции Spring. Когда транзакция выполняется, она будет заблокирована на всех уровнях, например, когда чтение и запись, как если бы транзакция проводится серийным образом, а не происходит вместе. Это предотвращает грязное чтение, неповторимое чтение и чтение Phantom, но это приведет к снижению производительности.
MySQL по умолчанию REPEATABLE_READ
Давайте посмотрим на пример ниже. Откройте транзакцию в базе данных MySQL и не совершайте. Затем другая транзакция гласит запись.
В начале записи в базе данных, как показано на рисунке
Затем открыть транзакцию A в базе данных MySQL и вставьте запись.
Атрибут транзакции класса службы в службе настроен как READ_UNCOMMITTED .
@Transactional (isolation = isolation.read_uncommitted) открытый класс accountservice {private accountdao accountdao; public accountdao getAccountdao () {return accountdao;} public void setAccountdao (accountdao accountdao) {this.accountdao = accountdao; {accountdao.outmoney (from, money); accountdao.inmoney (to, money);} public void readalluser () {list <colpscyths> accounts = accountdao.getalluser (); для (учетная запись: accounts) {system.out.println (account);}}}}}}}}}}}}}}}Запустите следующий тестовый класс
пакет com.chris.service; импорт статический org.junit.assert.*; import org.junit.test; import org.junit.runner.runwith; import org.springframework.beans.factory.annotation.autowired; импорт org.spramework.testestextextcrover; org.springframework.test.context.junit4.springjunit4classrunner; @runwith (springjunit4classrunner.class) @contextconfiguration ("ClassPath: ApplicationContext.xml") Public Class ReadallUsertest {@Autowired Private Accounts Accounservice @test atepest @testest stoadest @testest stoadest {accountservice.readalluser ();}}Результаты следующие:
Можно видеть, что эта транзакция считывает непрерывные данные.
В это время откатайтесь от транзакции, открытой в MySQL.
MySQL> Откат;
Запустите программу снова, и результат
Счет [имя = Майкл, деньги = 1000,0]
Счет [имя = Джейн, деньги = 1000,0]
Счет [name = kate, money = 1000.0]
Выше приведено все содержание этой статьи о введении к уровню изоляции транзакций пружинной транзакции и анализе примеров. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!