рд╡рд╕рдВрдд рдореЗрдВ рдХреБрд╢рд▓ рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрди

рд╕рднреА рдХреЛ рд╢реБрдн рджрд┐рди!

рдЦреИрд░, рдорд╣реАрдиреЗ рдХрд╛ рдЕрдВрдд рд╣рдореЗрд╢рд╛ рддреАрд╡реНрд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ "рдбреЗрд╡рд▓рдкрд░ рдСрди рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ" рдХреА рджреВрд╕рд░реА рдзрд╛рд░рд╛ рд╢реБрд░реВ рд╣реЛрдиреЗ рддрдХ рдХреЗрд╡рд▓ рдПрдХ рджрд┐рди рд╢реЗрд╖ рд╣реИ, рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕реБрдВрджрд░ рдФрд░ рдХреНрд░реЛрдзрд┐рдд рдпреВрд░реА рджреНрд╡рд╛рд░рд╛ рд╕рд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рдЕрджреНрднреБрдд рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдкрд╛рдареНрдпрдХреНрд░рдо (рдЬреИрд╕рд╛ рдХрд┐ рдХреБрдЫ рдЫрд╛рддреНрд░ рдЙрд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред рдбреАрдЬреЗрдб рдореЗрдВ), рддреЛ рдЖрдЗрдП рдПрдХ рдФрд░ рд╕рд╛рдордЧреНрд░реА рджреЗрдЦреЗрдВ рдЬреЛ рд╣рдордиреЗ рдЖрдкрдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХреА рд╣реИред

рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВред

рдкрд░рд┐рдЪрдп

рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдордп, рдбреЗрд╡рд▓рдкрд░реНрд╕ рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрди рдХреЛ рдорд╣рддреНрд╡ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╛ рддреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдХреЛ рдмрд╛рдж рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдпрд╛ рдбреЗрд╡рд▓рдкрд░ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд┐рдирд╛ рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд┐рди рдкрд╣рд▓реБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реВ рдПрдХ рд▓реЗрдирджреЗрди рдХреА рд╕рд╣реА рд╕реАрдорд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрдм рдПрдХ рд▓реЗрдирджреЗрди рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрдм рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдм рдбреЗрдЯрд╛ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрдм рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдкрдВрдк рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЕрдкрд╡рд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ)ред



рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реВ рдпрд╣ рд╕рдордЭрдирд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕рд░реНрд╡реЛрддреНрддрдо рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рддреЛ рдЖрдЗрдП рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред

рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрди рдХреЗ рддрд░реАрдХреЗ

рд▓реЗрдирджреЗрди рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

1. рдХрд╕реНрдЯрдо рдХреЛрдб рд▓рд┐рдЦрдХрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рдпрдВрддреНрд░рдг

рдпрд╣ рдПрдХ рдкреБрд░рд╛рдиреА рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрди рд╡рд┐рдзрд┐ рд╣реИред

EntityManagerFactory factory = Persistence.createEntityManagerFactory("PERSISTENCE_UNIT_NAME"); EntityManager entityManager = entityManagerFactory.createEntityManager(); Transaction transaction = entityManager.getTransaction() try { transaction.begin(); someBusinessCode(); transaction.commit(); } catch(Exception ex) { transaction.rollback(); throw ex; } 

рдкреЗрд╢реЗрд╡рд░реЛрдВ :

  • рдХреЛрдб рдореЗрдВ рд▓реЗрди-рджреЗрди рдХреА рд╕реАрдорд╛рдПрдБ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВред

рд╡рд┐рдкрдХреНрд╖ :

  • рдпрд╣ рджреЛрд╣рд░рд╛рд╡ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рд╣реИред
  • рдХрд┐рд╕реА рднреА рдЧрд▓рддреА рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдЕрд╕рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  • рдЖрдкрдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА, рдпрджрд┐ рдЖрдк рдЗрд╕ рд╡рд┐рдзрд┐ рд╕реЗ рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреЛрдб рд╕реЗ рдлрд┐рд░ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

2. рд╡рд╕рдВрдд рд╕реЗ рд▓реЗрди-рджреЗрди рдкреНрд░рдмрдВрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рд╕реНрдкреНрд░рд┐рдВрдЧ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ

1. рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЯреНрд░рд╛рдВрдЬреЗрдХреНрд╢рди рдореИрдиреЗрдЬрдореЗрдВрдЯ : рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЗрдирджреЗрди рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╡рд┐рдзрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЪреАрд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

2. рдбрд┐рдХреНрд▓рд░реЗрдЯрд┐рд╡ рдЯреНрд░рд╛рдВрдЬреИрдХреНрд╢рди рдореИрдиреЗрдЬрдореЗрдВрдЯ : рдЖрдк рдмрд┐рдЬрдиреЗрд╕ рд▓реЙрдЬрд┐рдХ рд╕реЗ рдЯреНрд░рд╛рдВрдЬреИрдХреНрд╢рди рдореИрдиреЗрдЬрдореЗрдВрдЯ рдХреЛ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдХреЗрд╡рд▓ рд▓реЗрди-рджреЗрди рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП XML- рдЖрдзрд╛рд░рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдо рдШреЛрд╖рдгрд╛рддреНрдордХ рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХрд╛рд░рдгреЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкрдврд╝реЗрдВ, рдЕрдиреНрдпрдерд╛ рдпрджрд┐ рдЖрдк рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╕реАрдзреЗ Declarative Transaction Management рд╕реЗрдХреНрд╢рди рдореЗрдВ рдЬрд╛рдПрдБред

рдЕрдм рдЖрдЗрдП рдкреНрд░рддреНрдпреЗрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВред

2.1ред рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рдЯреНрд░рд╛рдВрдЬреИрдХреНрд╢рди рдореИрдиреЗрдЬрдореЗрдВрдЯ:

рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рджреЛ рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдПрдХред TransactionTemplate (рд╕реНрдкреНрд░рд┐рдВрдЧ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

рдЖрдЗрдП рдиреАрдЪреЗ рджрд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджреЗрдЦреЗрдВ (рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдкреНрд░рд┐рдВрдЧ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛)

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЙрдХреНрд╕ рд╕реЗ рд▓рд┐рдП рдЧрдП рд╣реИрдВред

рд╕рдВрджрд░реНрдн Xml рдлрд╝рд╛рдЗрд▓:

 <!-- Initialization for data source --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/TEST"/> <property name="username" value="root"/> <property name="password" value="password"/> </bean> <!-- Initialization for TransactionManager --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- Definition for ServiceImpl bean --> <bean id="serviceImpl" class="com.service.ServiceImpl"> <constructor-arg ref="transactionManager"/> </bean> 

Service рд╡рд░реНрдЧ:

 public class ServiceImpl implements Service { private final TransactionTemplate transactionTemplate; //       PlatformTransactionManager public ServiceImpl(PlatformTransactionManager transactionManager) { this.transactionTemplate = new TransactionTemplate(transactionManager); } //       ,   ,    //       xml  this.transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED); this.transactionTemplate.setTimeout(30); //30  ///    public Object someServiceMethod() { return transactionTemplate.execute(new TransactionCallback() { //         public Object doInTransaction(TransactionStatus status) { updateOperation1(); return resultOfUpdateOperation2(); } }); }} 

рдпрджрд┐ рдХреЛрдИ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рдЕрдирд╛рдо рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ TransactionCallbackWithoutResult рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 transactionTemplate.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(TransactionStatus status) { updateOperation1(); updateOperation2(); } }); 

  • TransactionTemplate рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рднреА рд╕рдВрд╡рд╛рдж рд░рд╛рдЬреНрдп рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред
  • TransactionTemplate рдЖрд╡реГрддреНрддрд┐рдпрд╛рдБ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд▓рдЧ рдЖрдЗрд╕реЛрд▓реЗрд╢рди рд╕реНрддрд░) рдХреЗ рд╕рд╛рде TransactionTemplate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ TransactionTemplate рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХреБрдЫ рд╡рд░реНрдЧ рд╕рдорд╛рди TransactionTemplate рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЦред PlatformTransactionManager рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

рдЖрдЗрдП рдХреЛрдб рдореЗрдВ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдлрд┐рд░ рд╕реЗ рджреЗрдЦреЗрдВред

 <!-- Initialization for data source --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/TEST"/> <property name="username" value="root"/> <property name="password" value="password"/> </bean> <!-- Initialization for TransactionManager --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> public class ServiceImpl implements Service { private PlatformTransactionManager transactionManager; public void setTransactionManager( PlatformTransactionManager transactionManager) { this.transactionManager = transactionManager; } DefaultTransactionDefinition def = new DefaultTransactionDefinition(); //     -  ,       def.setName("SomeTxName"); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = txManager.getTransaction(def); try { //   -  } catch (Exception ex) { txManager.rollback(status); throw ex; } txManager.commit(status); } 

рдЕрдм, рд▓реЗрди-рджреЗрди рдкреНрд░рдмрдВрдзрди рдХреА рдЕрдЧрд▓реА рд╡рд┐рдзрд┐ рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрди рдЪреБрдирдирд╛ рд╣реИред

рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рдФрд░ рдбрд┐рдХреНрд▓реЗрд░реЗрдЯрд┐рд╡ рдЯреНрд░рд╛рдВрдЬреИрдХреНрд╢рди рдореИрдиреЗрдЬрдореЗрдВрдЯ рдХреЗ рдмреАрдЪ рдЪрдпрди:

  • рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рдЯреНрд░рд╛рдВрдЬреИрдХреНрд╢рди рдореИрдиреЗрдЬрдореЗрдВрдЯ рддрднреА рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЯреНрд░рд╛рдВрдЬреЗрдХреНрд╢рдирд▓ рдСрдкрд░реЗрд╢рдВрд╕ рд╣реЛрдВред (рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпреЗ рд▓реЗрдирджреЗрди рдирд╣реАрдВ рд╣реИрдВред)
  • рд▓реЗрди-рджреЗрди рдХрд╛ рдирд╛рдо рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрди рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рдЬрдм рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓реЗрди-рджреЗрди рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рдЯреНрд░рд╛рдВрдЬреЗрдХреНрд╢рди рдореИрдиреЗрдЬрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХрдИ рд▓реЗрди-рджреЗрди рд╡рд╛рд▓реЗ рд╕рдВрдЪрд╛рд▓рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рддреЛ рдпрд╣ рдШреЛрд╖рдгрд╛рддреНрдордХ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
  • рдШреЛрд╖рдгрд╛ рдкреНрд░рдмрдВрдзрди рдЖрдкрдХреЛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдореЗрдВ рд▓реЗрдирджреЗрди рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред

2.2ред рдШреЛрд╖рдгрд╛рддреНрдордХ рд▓реЗрдирджреЗрди (рдЖрдорддреМрд░ рдкрд░ рдХрд┐рд╕реА рднреА рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рдЧрднрдЧ рд╕рднреА рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)

рдЪрд░рдг 1 : рдЕрдкрдиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн xml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред

 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"/> <tx:annotation-driven transaction-manager="txManager"/> 

рдЪрд░рдг 2 : рдЕрдкрдиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн xml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝рдХрд░ рдПрдиреЛрдЯреЗрд╢рди рд╕рдорд░реНрдерди рд╕рдХреНрд╖рдо рдХрд░реЗрдВред

рдпрд╛ рдЕрдкрдиреА рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рдореЗрдВ @EnableTransactionManagement рдЬреЛрдбрд╝реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 @Configuration @EnableTransactionManagement public class AppConfig { ... } 

рд╕реНрдкреНрд░рд┐рдВрдЧ рдиреЗ @Transactional рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧреЛрдВ (рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рддрд░реАрдХреЛрдВ) рдХреЛ @ @Transactional рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдиреЛрдЯреЗрдЯ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рд╣реИред

рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реНрддрд░ рдкрд░ рд░рдЦрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдкреНрд░реЙрдХреНрд╕реА рдХреНрд▓рд╛рд╕реЗрд╕ ( proxy-target-class = ┬лtrue┬╗ ) рдпрд╛ mode = ┬лaspectj┬╗ ( mode = ┬лaspectj┬╗ ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЯреНрд░рд╛рдВрдЬреИрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкреНрд░реЙрдХреНрд╕реА рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рджреНрд╡рд╛рд░рд╛ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдФрд░ plexuses, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓реЗрди-рджреЗрди рд╡реНрдпрд╡рд╣рд╛рд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдЪрд░рдг 3 : рд╡рд░реНрдЧ (рд╡рд░реНрдЧ рд╡рд┐рдзрд┐) рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐) рдореЗрдВ @ @Transactional рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝реЗрдВред

 <tx:annotation-driven proxy-target-class="true"> 

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди: proxy-target-class="false"

  • @Transactional рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐, рдПрдХ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдпрд╛ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╣рд▓реЗ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпрд╛рдБ ( @Transactional рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд) рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реЛрдВ, рдЬреИрд╕реЗ рдЖрдЗрд╕реЛрд▓реЗрд╢рди рд╕реНрддрд░ рдпрд╛ рдкреНрд░рдЪрд╛рд░ рд╕реНрддрд░, рдХреНрд▓рд╛рд╕ рд╕реНрддрд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рд╕реНрддрд░ рдкрд░ рдПрдиреЛрдЯреЗрд╢рди рд░рдЦреЗрдВред
  • рдкреНрд░реЙрдХреНрд╕реА рдореЛрдб рдореЗрдВ (рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рдкреНрд░реЙрдХреНрд╕реА рд╕реЗ рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓реА рдХреЗрд╡рд▓ "рдмрд╛рд╣рд░реА" рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ "рд╕реНрд╡рддрдВрддреНрд░ рдХреЙрд▓", рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рдХреНрд╖реНрдп рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рд▓рдХреНрд╖реНрдп рдХреЗ рдХреБрдЫ рдЕрдиреНрдп рддрд░реАрдХреЗ рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИ, рд░рдирдЯрд╛рдЗрдо рдкрд░ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЗрдирджреЗрди рдХрд╛ рдиреЗрддреГрддреНрд╡ рдирд╣реАрдВ рдХрд░реЗрдЧреА, рднрд▓реЗ рд╣реА рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЛ @ @Transactional рд╕рд╛рде рдЯреИрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред

рдЕрдм рдЪрд▓рд┐рдП @ @Transactional рдПрдиреЛрдЯреЗрд╢рди @Transactional рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ @Transactional

@Transactional (isolation=Isolation.READ_COMMITTED)

  • рдбрд┐рдлрд╝реЙрд▓реНрдЯ Isolation.DEFAULT
  • рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рди рд╣реЛрдВред
  • рд▓реЗрди-рджреЗрди рдкреНрд░рдмрдВрдзрдХ ( tx ) рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓реЗ рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░ рдХреЛ рд╡рд░реНрддрдорд╛рди tx рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рд╕реЗ tx рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ tx рдкреНрд░рд╛рд░рдВрдн рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣рдо рдЖрдЗрд╕реЛрд▓реЗрд╢рди рд╕реНрддрд░ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗред

DEFAULT : рдЖрдзрд╛рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЖрдЗрд╕реЛрд▓реЗрд╢рди рд╕реНрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

READ_COMMITTED (рдлрд┐рдХреНрд╕реНрдб рдбреЗрдЯрд╛ рдкрдврд╝рдирд╛): рдПрдХ рдирд┐рд░рдВрддрд░ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рдЧрдВрджреЗ рдкрдврд╝рдиреЗ рдХреЛ рд░реЛрдХрд╛ рдЧрдпрд╛ рд╣реИ; рдиреЙрди-рд░рд┐рдкрд┐рдЯрд┐рдВрдЧ рд░реАрдбрд┐рдВрдЧ рдФрд░ рдлреИрдВрдЯрдо рд░реАрдбрд┐рдВрдЧ рд╣реЛ рд╕рдХрддреА рд╣реИред

READ_UNCOMMITTED ( рдЕрдирдХрдореНрдпреВрдЯреЗрдб рдбреЗрдЯрд╛ рдкрдврд╝реЗрдВ): рдпрд╣ рдЖрдЗрд╕реЛрд▓реЗрд╢рди рд▓реЗрд╡рд▓ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЯреНрд░рд╛рдВрдЬреИрдХреНрд╢рди рдЙрди рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрднреА рддрдХ рдЕрдиреНрдп рдЯреНрд░рд╛рдВрдЬреЗрдХреНрд╢рди рд╕реЗ рдбрд┐рд▓реАрдЯ рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВред

REPEATABLE_READ (рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрдврд╝реЗрдВ): рдПрдХ рдирд┐рд░рдВрддрд░ рд╕рдВрдХреЗрдд рдЬреЛ рдЧрдВрджреЗ рдкрдврд╝рдиреЗ рдФрд░ рдЧреИрд░-рджреЛрд╣рд░рд╛рдиреЗ рдпреЛрдЧреНрдп рдкрдврд╝рдиреЗ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ; рдкреНрд░реЗрдд рд╡рд╛рдЪрди рдкреНрд░рдХрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдиреБрдХреНрд░рдорд┐рдХ : рд╕реНрдерд╛рдпреА, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЧрдВрджреЗ рдкрдврд╝рдиреЗ, рдЧреИрд░-рджреЛрд╣рд░рд╛рдиреЗ рдпреЛрдЧреНрдп рдкрдврд╝рдиреЗ рдФрд░ рдкреНрд░реЗрдд рдкрдврд╝рдиреЗ рдХреЛ рд░реЛрдХрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрди рд╢рдмреНрджрдЬрд╛рд▓ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ: "рдЧрдВрджреЗ" рдкрдврд╝рдирд╛, рдкреНрд░реЗрдд рдкрдврд╝рдирд╛ рдпрд╛ рдмрд╛рд░-рдмрд╛рд░ рдкрдврд╝рдирд╛?

  • рдбрд░реНрдЯреА рд░реАрдб : рдЯреНрд░рд╛рдВрдЬреЗрдХреНрд╢рди рдП рд▓рд┐рдЦрддрд╛ рд╣реИред рдЗрд╕ рдмреАрдЪ, рд▓реЗрди-рджреЗрди "рдмреА" рд▓реЗрди-рджреЗрди рдП рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдПрдХ рд╣реА рд░рд┐рдХреЙрд░реНрдб рдкрдврд╝рддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ, рд▓реЗрдирджреЗрди рдП рдиреЗ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реЗрдирджреЗрди рдмреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВ рдЬреЛ рдЕрд╕рдВрдЧрдд рд╣реИрдВред рдпрд╣ рдПрдХ рдЧрдВрджрд╛ рдкрд╛рда рд╣реИред рд▓реЗрдирджреЗрди рдмреА рдиреЗ рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░ READ_UNCOMMITTED рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд▓реЗрдирджреЗрди рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЗрдирджреЗрди рдП рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкрдврд╝ рд╕рдХрддрд╛ рдерд╛ред
  • рдЧреИрд░-рджреЛрд╣рд░рд╛рдиреЗ рдпреЛрдЧреНрдп рдкрдврд╝реЗрдВ : рд▓реЗрди-рджреЗрди "рдП" рдХреБрдЫ рд░рд┐рдХреЙрд░реНрдб рдкрдврд╝рддрд╛ рд╣реИред рдлрд┐рд░ рд▓реЗрдирджреЗрди "рдмреА" рдЗрд╕ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ, рд▓реЗрдирджреЗрди рдП рдиреЗ рдПрдХ рд╣реА рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рд╛ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрдирджреЗрди рдмреА рдиреЗ рдЗрд╕ рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд┐рдП рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддрд┐рдмрджреНрдз рдХрд┐рдпрд╛ред рдпрд╣ рдПрдХ рдЧреИрд░-рджреЛрд╣рд░рд╛рдИ рдЧрдИ рд░реАрдбрд┐рдВрдЧ рд╣реИред
  • рдкреНрд░реЗрдд рдкрдврд╝реЗрдВ : рд▓реЗрди-рджреЗрди "рдП" рд░рд┐рдХреЙрд░реНрдб рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрдврд╝рддрд╛ рд╣реИред рдЗрд╕ рдмреАрдЪ, рд▓реЗрди-рджреЗрди "рдмреА" рд▓реЗрди-рджреЗрди рдП рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдПрдХ рдирдпрд╛ рд░рд┐рдХреЙрд░реНрдб рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ, рд▓реЗрди-рджреЗрди рдП рдЙрд╕реА рд╕реАрдорд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рднреА рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд▓реЗрдирджреЗрди рдмреА рд╕рд┐рд░реНрдл рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рдкреНрд░реЗрдд рд░реАрдб рд╣реИ: рд▓реЗрдирджреЗрди рдиреЗ рдХрдИ рд░рд┐рдХреЙрд░реНрдбреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ред рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ (рдкреНрд░реЗрдд рд░рд┐рдХреЙрд░реНрдб рд╡рд╛рд▓реЗ) рдкреНрд░рд╛рдкреНрдд рдХрд┐рдПред

@Transactional(timeout=60)

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд▓реЗрдирджреЗрди рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╣реИред

рд╕рдордп рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ tx рдкреНрд░рдмрдВрдзрдХ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЬрдм рддрдХ рдХрд┐ рдЧреИрд░-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд▓реЗрдирджреЗрди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ tx рдирд┐рд╖реНрдХреНрд░рд┐рдп рди рд╣реЛ рдЬрд╛рдП, рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред

@Transactional(propagation=Propagation.REQUIRED)

рдпрджрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рд╕рд╛рд░ рд╡реНрдпрд╡рд╣рд╛рд░ REQUIRED ред

рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк REQUIRES_NEW, MANDATORY, SUPPORTS, NOT_SUPPORTED, NEVER рдФрд░ NESTED ред

рдЖрд╡рд╢реНрдпрдХ

рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд▓рдХреНрд╖реНрдп рд╡рд┐рдзрд┐ рдПрдХ рд╕рдХреНрд░рд┐рдп tx рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рдЯреАрдПрдХреНрд╕ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рдЙрд╕реА рдЯреАрдПрдХреНрд╕ рдореЗрдВ рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛, рдпрд╛ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдирдпрд╛ рдЯреАрдПрдХреНрд╕ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

REQUIRES_NEW

  • рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рд▓рдХреНрд╖реНрдп рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдПрдХ рдирдпрд╛ tx рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ tx рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рдПрдХ рдирдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдирд┐рд╡рд╛рд░реНрдп

  • рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд▓рдХреНрд╖реНрдп рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп tx рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ tx рдЬрд╛рд░реА рдирд╣реАрдВ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ

  • рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд▓рдХреНрд╖реНрдп рд╡рд┐рдзрд┐ рдХреЛ tx рдХреЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ tx рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЙрд╕реА tx рдореЗрдВ рднрд╛рдЧ рд▓реЗрдЧрд╛ред рдпрджрд┐ tx рдХреЗ рдмрд┐рдирд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рддрдм рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИред

  • рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЗ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВред

NOT_SUPPORTED

  • рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд▓рдХреНрд╖реНрдп рд╡рд┐рдзрд┐ рдХреЛ рд▓реЗрдирджреЗрди рд╕рдВрджрд░реНрдн рдкреНрд░рд╕рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  • рдореВрд▓ рд░реВрдк рд╕реЗ, рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдПрдХ рд▓реЗрдирджреЗрди рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЛ рд░реИрдо рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВред

рдХрднреА рдирд╣реАрдВ

  • рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд▓рдХреНрд╖реНрдп рдкрджреНрдзрддрд┐ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрдЧреА рдпрджрд┐ рдПрдХ рд▓реЗрдирджреЗрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣реИ рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

@Transactional (rollbackFor=Exception.class)

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди: rollbackFor=RunTimeException.class

рд╡рд╕рдВрдд рдореЗрдВ, рд╕рднреА рдПрдкреАрдЖрдИ рдХрдХреНрд╖рд╛рдПрдВ рдПрдХ RuntimeException рдлреЗрдВрдХрддреА рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рд╡рд┐рдзрд┐ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдХрдВрдЯреЗрдирд░ рд╣рдореЗрд╢рд╛ рд╡рд░реНрддрдорд╛рди рд▓реЗрдирджреЗрди рдХреЛ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рддрд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдХреЗрд╡рд▓ рдЬрд╛рдБрдЪ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, Checked Exception рд╣реЛрдиреЗ рдкрд░, рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЗрди-рджреЗрди рдХреЛ рд╡рд╛рдкрд╕ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@Transactional (noRollbackFor=IllegalStateException.class)

рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рд▓рдХреНрд╖реНрдп рд╡рд┐рдзрд┐ рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рдЙрдард╛рддреА рд╣реИ рддреЛ рд░реЛрд▓рдмреИрдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдм, рд▓реЗрди-рджреЗрди рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдЕрдВрддрд┐рдо рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрджрдо @Transactiona l рдПрдиреЛрдЯреЗрд╢рди рдкреЛрд╕реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рднреНрд░рдо рдкреИрджрд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдПрдиреЛрдЯреЗрд╢рди рдХрд╣рд╛рдВ рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рд╕реЗрд╡рд╛ рд╕реНрддрд░ рдкрд░ рдпрд╛ рдбреАрдПрдУ рд╕реНрддрд░ рдкрд░?

@Transactional : рд╕реЗрд╡рд╛ рдпрд╛ DAO рд╕реНрддрд░?

рд╕реЗрд╡рд╛ @Transactional рд╕реНрдерд╛рди @Transactional рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рд╣реИ, рд╕реЗрд╡рд╛ рд╕реНрддрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрдкрд░реНрдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рд▓реЗрдирджреЗрди рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред

рдХрдИ CRUD рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ рдПрдХ рд╕реЗрд╡рд╛ рд╕реНрддрд░ рд╣реИ рдЬреЛ рдмрд╕ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдФрд░ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдо рд▓реЗрди-рджреЗрди рдПрдиреЛрдЯреЗрд╢рди рдХреЛ DAO рд╕реНрддрд░ рдкрд░ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдХрд╣реАрдВ рднреА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЖрдкрдХреЗ рдКрдкрд░ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк DAO рд▓реЗрдпрд░ рдореЗрдВ @Transactional рдХреЛ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрдкрдХреА DAO рд▓реЗрдпрд░ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрд╡рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдЗрд╕реЗ DAO рд▓реЗрдпрд░ рдореЗрдВ рд░рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рдпрджрд┐ рдЖрдкрдХрд╛ рд╕реЗрд╡рд╛ рд╕реНрддрд░ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдбреЛрдореЗрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдЖрд▓рд╕реА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рд░реНрд╡рд┐рд╕ рд▓реЗрд╡рд▓ рдкрд░ рд▓реЗрди-рджреЗрди рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЖрдк ORM рджреНрд╡рд╛рд░рд╛ рдлреЗрдВрдХреЗ рдЧрдП LazyInitializationException рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗред

рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХрд╛ рд╕реЗрд╡рд╛ рд╕реНрддрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреАрдПрдУ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХрд╛ рдкрд╣рд▓рд╛ DAO рдСрдкрд░реЗрд╢рди рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛, рддреЛ рдЕрдиреНрдп рджреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдЕрд╕рдВрдЧрдд рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдВрдЧреЗред рд╕реЗрд╡рд╛ рд╕реНрддрд░ рдПрдиреЛрдЯреЗрд╢рди рдЖрдкрдХреЛ рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдиреЗ рдЖрдкрдХреА рдорджрдж рдХреАред

рдЕрдВрдд

рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдпрд╛ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рд╣рдореЗрд╢рд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi431508/


All Articles