PROPAGATION_REQUIRED = 0 ;Если DataSourceTransactionObject T1 уже запущен для метода M1. Если для другого метода M2 требуется объект транзакции, новый объект транзакции не создается. Один и тот же объект T1 используется для M2
PROPAGATION_MANDATORY = 2 ;метод должен выполняться внутри транзакции.Если ни одна из существующих транзакций не выполняется, будет сгенерировано исключение
PROPAGATION_REQUIRES_NEW = 3 ;Если DataSourceTransactionObject T1 уже запущен для метода M1 и он выполняется (выполняется метод M1). Если другой метод M2 начинает выполнение, то T1 приостанавливается на время метода M2 с новым DataSourceTransactionObject T2 для M2.M2, запущенного в его собственном контексте транзакции
PROPAGATION_NOT_SUPPORTED = 4 ;Если DataSourceTransactionObject T1 уже запущен для метода M1.Если одновременно выполняется другой метод M2, то M2 не должен выполняться в контексте транзакции.T1 приостанавливается до завершения M2.
PROPAGATION_NEVER = 5 ;Ни один из методов не выполняется в контексте транзакции.
Уровень изоляции: Речь идет о том, насколько на транзакцию могут повлиять действия других параллельных транзакций. Это обеспечивает согласованность, оставляя данныепо многим таблицам в согласованном состоянии.Он включает блокировку строк и / или таблиц в базе данных.
Проблема с несколькими транзакциями
Сценарий 1 . Если транзакция T1 считывает данные изТаблица A1, которая была записана другой параллельной транзакцией T2. Если на пути T2 выполняется откат, то данные, полученные T1, недопустимы. Например, a = 2 - исходные данные. Если T1 прочитал a = 1, записанный T2.If T2Откат, тогда a = 1, будет откат до a = 2 в DB. Но, теперь, T1 имеет a = 1, но в таблице DB он изменяется на = 2.
Scenario2 .Если транзакция T1 считывает данные из таблицы A1.Если другая параллельная транзакция (T2) обновляет данные в таблице A1.Затем данные, которые прочитал T1, отличаются от таблицы A1. Потому что T2 обновил данные в таблице A1.Eg, если T1 прочитал= 1 и T2 обновлены a = 2. Затем a! = B.
Сценарий 3 . Если транзакция T1 считывает данные из таблицы A1 с определенным количеством строк.Если другая параллельная транзакция (T2) вставляет больше строк в таблицу A1. Число строк, считываемых T1, отличается от строк в таблице A1
Сценарий 1 называется Грязные чтения.
Сценарий 2 называется Неповторяемые чтения.
Сценарий 3 называется Фантомные чтения.
Таким образом, уровень изоляции - это расширениена что Сценарий 1, Сценарий 2, Сценарий 3 можно предотвратить.Вы можете получить полный уровень изоляции, реализовав блокировку. Это предотвращает одновременное чтение и запись в одни и те же данные. Но это влияет на производительность. Уровень изоляции зависит от приложения к приложению, насколько требуется изоляция.
ISOLATION_READ_UNCOMMITTED : позволяет читать изменения, которые еще не были зафиксированы. Сценарий 1, Сценарий 2, Сценарий 3
ISOLATION_READ_COMMITTED : разрешает чтение из одновременных транзакцийкоторые были совершены.Это может пострадать от сценария 2 и сценария 3. Поскольку другие транзакции могут обновлять данные.
ISOLATION_REPEATABLE_READ : Многократное чтение одного и того же поля даст одинаковые результаты, пока оно не будет изменено само собой. Может пострадать от сценария 3. Потому что другие транзакции могут вставлять данные
ISOLATION_SERIALIZABLE : сценарий 1, сценарий 2, сценарий 3 никогда не происходит. Это полная изоляция. Это предполагает полную блокировку..Это влияет на производительность из-за блокировки.
Вы можете проверить с помощью
public class TransactionBehaviour {
// set is either using xml Or annotation
DataSourceTransactionManager manager=new DataSourceTransactionManager();
SimpleTransactionStatus status=new SimpleTransactionStatus();
;
public void beginTransaction()
{
DefaultTransactionDefinition Def = new DefaultTransactionDefinition();
// overwrite default PROPAGATION_REQUIRED and ISOLATION_DEFAULT
// set is either using xml Or annotation
manager.setPropagationBehavior(XX);
manager.setIsolationLevelName(XX);
status = manager.getTransaction(Def);
}
public void commitTransaction()
{
if(status.isCompleted()){
manager.commit(status);
}
}
public void rollbackTransaction()
{
if(!status.isCompleted()){
manager.rollback(status);
}
}
Main method{
beginTransaction()
M1();
If error(){
rollbackTransaction()
}
commitTransaction();
}
}
Вы можете отладить и увидеть результат с различными значениями для изоляции и распространения.