Транзакции Spring из серии Spring Core

Spring Boot задняя часть база данных Spring

Транзакции Spring из серии Spring Core

Всем привет, в предыдущих двух статьях делился с вами Spring AOP.Сегодня буду ковать железо пока горячо и поделюсь с вами.На самом деле некоторые небольшие компании в Китае вообще игнорируют дела и дела в Spring,особенно многие сайты. ,системе не рассчитанной на деньги будет наплевать на это дело.Результат не отката транзакции не более чем последствия грязных данных и грязных изменений. Потому что автор раньше был на сайте недвижимости, и его вообще не интересовал этот вопрос.Если есть проблема, будет проблема.В любом случае пользователь не брал деньги на сайте. хе-хе. Сегодня я хотел бы поделиться с вами делами этого Спринга, потому что эта штука является лучшим отражением использования АОП в Спринге, что отражает идею АОП, ОК, и структуру статьи:

  1. Транзакции в весенней загрузке
  2. Свойства транзакций в Spring Transactions

1. Транзакции в весенней загрузке

Увидев Spring boot, многие должны почувствовать, что их одурачили. Зачем вы говорите о делах Spring? Вот почему Spring boot снова делает свое дело. Друзья, которые использовали Spring boot, на самом деле знают, что между ними нет большой разницы Автор использует Spring boot для демонстрации здесь, поэтому это просто. Потому что сборка традиционного проекта Spring ssm, состоящего из трех частей, может занять 5 минут, а сборка проекта Spring boot «ssm» — это вопрос щелчка мышью. И открытие сделки — тоже вопрос аннотации. Итак, старые утюги, извините, в этой статье используется Spring boot, чтобы продемонстрировать вам дела Spring. Здесь я приведу вам портал, который является делами традиционных проектов. Вы можете обратиться к следующему:

Ерунда, переходим сразу к загрузочному коду Spring:

@SpringBootApplication
@EnableTransactionManagement  
public class TestTxApplication {

	public static void main(String[] args) {
		SpringApplication.run(TestTxApplication.class, args);
	}
}

@EnableTransactionManagement означает открытие транзакции!

@Component
public class PersonService {
    @Autowired
    private PersonMapper personMapper;

    @Transactional
    public void testTx(){
        //该操作会成功
        personMapper.update();
        //该操作会报异常
        personMapper.update2();
    }
}

Это Служба, внутренний personMapper — это интерфейс dao, mybatis для постоянства.

@Mapper
public interface PersonMapper {
    //更改某条记录
    @Update("update user_info set user_name='123'  where user_id='1' ")
    Long update();
    //user_info2这个表不存在。会报异常
    @Update("update user_info2 set user_name='123'  where user_id='1' ")
    Long update2();
}

Эффект от демонстрации должен быть:

  1. Когда вызывается testTx() PersonService, поскольку транзакция открыта, когда update2 сообщает об исключении, его следует откатить. Операция update1 не будет записана в базу данных.
  2. Удалите аннотацию @Transactional в testTx(), выполните тест еще раз и обнаружите, что, несмотря на сообщение об исключении, данные все еще обновляются.

Специально демонстрировать не буду. Как видите, открытие транзакции в Spring boot — это вопрос аннотации. Неважно, какой trancationManagement используется внутри, Spring boot автоматически внедрит его в соответствии с инфраструктурой уровня сохраняемости, представленной в файле pom. Это действительно артефакт разработки!

Затем я говорю об основном принципе:Транзакция Spring на самом деле является Spring AOP, нижний уровень создает динамические прокси-объекты и инкапсулирует операции открытия транзакции и отката транзакции в начале и конце кода.. Те, кто использовал нативный код JDBC, должны яснее знать, что отображается в коммите и откате в прокси. Тогда целая куча попыток поймать..

2. Свойства транзакций в Spring Transactions

Хотя вышеприведенный код прост и может работать с большинством сценариев, все же есть некоторые проблемы.Например, некоторые разработчики исключений знают и хотят управлять им искусственно, «кинув определенный тип исключения, не откатывать назад».Такие проблемы . Это ведет к,Свойства транзакцииэто понятие,Свойства транзакции обычно состоят из поведения распространения транзакции, уровня изоляции транзакции, значения времени ожидания транзакции и флага транзакции только для чтения.. Эти свойства можно указать с помощью @Transactional, я даю форму:

Затем поговорим об этих свойствах:

2.1 isolation

Уровень изоляции транзакции: используйте свойство Isolation @Transactional, чтобы указать уровень изоляции транзакции. Но уровень изоляции транзакции реализуется базовой базой данных, а не Spring.

  1. ISOLATION_DEFAULT, который является уровнем изоляции по умолчанию, использующим уровень изоляции транзакций базы данных по умолчанию.Остальные четыре соответствуют уровню изоляции JDBC.
  2. ISOLATION_READ_UNCOMMITTEDЭто самый низкий уровень изоляции для транзакции, который позволяет другой транзакции видеть незафиксированные данные этой транзакции. Этот уровень изоляции производит грязные чтения, неповторяемые чтения и фантомные чтения.
  3. ISOLATION_READ_COMMITTEDГарантируется, что данные, измененные одной транзакцией, могут быть прочитаны другой транзакцией только после ее фиксации. Другая транзакция не может прочитать незафиксированные данные транзакции. Этот уровень изоляции транзакций позволяет избежать грязных чтений, но может иметь место неповторяющееся чтение и фантомное чтение.
  4. ISOLATION_REPEATABLE_READЭтот уровень изоляции транзакций предотвращает грязное чтение и неповторяющееся чтение. Однако могут возникать фантомные чтения. В дополнение к тому, что транзакция не может прочитать незафиксированные данные другой транзакции, она также гарантирует неповторяющееся чтение.
  5. ISOLATION_SERIALIZABLEЭто самый дорогой, но самый надежный уровень изоляции транзакций. Транзакции обрабатываются для последовательного выполнения. В дополнение к предотвращению грязных чтений, неповторяющихся чтений, он также позволяет избежать фантомных чтений.

Общие базы данных обеспечивают уровень изоляции READ_COMMITTED по умолчанию, например sqlserver2000, Mysql по умолчанию предоставляет REPEATABLE_READ;

Что ж, вывод для всех готов, а дальше объяснять понятия грязных чтений, неповторяемых чтений и фантомных чтений, упомянутых выше.

грязное чтение:

  1. Первоначальная зарплата Мэри была 1000, финансовый персонал изменил зарплату Марии на 8000, но транзакция не была отправлена
  2. В то же время Мэри читает свою зарплату Мэри обнаруживает, что ее зарплата изменилась на 8000, счастлива! (грязное чтение)
  3. Финансы обнаружили, что операция была неправильной, и откатили транзакцию, и зарплата Марии снова стала 1000.

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

  1. В транзакции 1 Мэри считывает свою зарплату как 1000, и операция не завершена.
  2. В транзакции 2 финансовый персонал изменил зарплату Мэри на 2000 и отправил транзакцию.
  3. В транзакции 1, когда Мэри снова считывает свою зарплату, она становится равной 2000.

фэнтези чтение:

  1. В настоящее время в штате 10 сотрудников с окладом 1000.
  2. Транзакция 1 считывает всех сотрудников, чья зарплата равна 1000. Всего было прочитано 10 записей.
  3. В это время другая транзакция вставляет в таблицу сотрудников запись о сотруднике, и зарплата тоже 1000
  4. Транзакция 1 снова считывает всех сотрудников с зарплатой 1000, всего считывается 11 записей, что приводит к фантомному чтению.

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

2.2 propagation

  1. НЕОБХОДИМО: указывает, что бизнес-метод должен быть обработан в транзакции.Если бизнес-метод уже находится в транзакции, когда он выполняется, присоединитесь к транзакции, в противном случае перезапустите транзакцию. Это также поведение распространения транзакций по умолчанию;
  2. NOT_SUPPORTED: объявляет, что бизнес-метод не требует транзакции.Если бизнес-метод уже находится в транзакции, когда он выполняется, транзакция приостанавливается.После выполнения метода транзакция возобновляется;

Другие варианты поведения распространения опущены, в основном не используются, а также используется поведение распространения по умолчанию: ТРЕБУЕТСЯ

2.3 rollbackFor rollbackForClassName noRollbackFor norollbackForClassName

Контроль транзакционных исключений, по умолчанию Check Exception не откатывается, unCheck Exception откатываетсяКонфигурация rollbackFor и noRollbackFor может не охватывать все исключения.Для отсутствующих установите флажок Исключение не откатывается и снимите флажок Исключение откатывает.

Используйте атрибуты noRollbackFor и rollbackFor аннотации @Transactional, чтобы изменить поведение по умолчанию:

  • Например: @Transactional(rollbackFor=Exception.class) может выполнять откат операции базы данных при возникновении проверенного исключения, а @Transactional(noRollbackFor=RuntimeException.class) может также выполнять операцию базы данных при возникновении непроверенного исключения.

Вы также можете использовать свойства noRollbackForClassName, rollbackForClassName, чтобы указать массив String имен классов исключений для изменения поведения по умолчанию.

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

Честно говоря, конфигурация общих свойств транзакций относительно невелика, и обычно это делается путем прямого добавления @Transactional. Некоторые свойства редко настраиваются. Особенно поведение распространения транзакций, в повседневном бизнесе есть несколько случаев вложения продуктов, поэтому я просто заказал немного, но не расширил. Обычно по умолчанию все в порядке.

Эпилог

Что ж, с вами поделились уровнем использования транзакций в Spring, немного страшновато использовать транзакции в Spring boot. Поэтому я использую Spring Boot. На самом деле, традиционный проект SSM тоже очень прост, это не что иное, как настройка управления транскрипцией в xml-файле, а нижний уровень транзакции Spring — это Spring AOP, в который встраивается код транзакции jdbc.Over,Have a good day!