Spring Transaction & Spring AOP ศิรส สุภาวิตา @siros_s
Agenda: Spring Transaction Why Spring Transaction Transaction Manager Declarative Transaction with Annotation @Transactional Propagation Exception Handling
Why Spring Transaction? Uniform API Transactional resource synchronization On and off server Declarative Transaction
What about JTA? Require J(2)EE container (server) Require EJB for declarative transaction Necessary for distributed transaction
Uniform API Application Spring Transaction JDBC ORM JCA JTA
Transactional Resource Sync Spring Transaction
On and Off Server Spring Spring Spring Servlet Container J(2)EE Java
Declarative Transaction B C Begin Commit D Begin Commit D B C
Declarative Transaction (cont.) Transaction Demarcation Transaction logic is NOT the main business logic Reuse business logic with different transaction logic Programmatic transaction demarcation is NOT the answer
Transactional Resource Transaction Manager Transactional Resource Transaction Manager
Transaction Annotation Use annotation to declare transaction scope Require just one line of config in XML
Example: MyService
Example: Transactional MyService
Example: Detailed MyService
Propagation Define how transaction manager handles transaction SUPPORTS NOT_SUPPORTED REQUIRED REQUIRES_NEW MANDATORY NEVER NESTED
Example: Propagation A B C D REQUIRED SUPPORTS REQUIRED MANDAROTY REQUIRES_NEW NEVER A B C D REQUIRES_NEW
Exception Handling Default behavior Rollback for unchecked exception No rollback for checked exception Can be changed with @Transactional properties rollbackFor rollbackForClassname noRollbackFor noRollbackForClassname
Example: Exception Handling
Wait!! There is a better way!! Q & A
Agenda: Spring AOP Problems of existing approach AOP Definition AOP Proxy Spring AOP Spring Transaction with AOP
Problems?? Transaction policy is still defined locally on each class rather than globally across all classes. Modularity & Reusability Scattering & Tangling Even a medium sized application has multiple “concerns”.
Example of Transaction Policy All top level service operations must begin a new transaction (REQUIRES_NEW). Lower level service operations must operate under an existing transaction (MANDATORY). Data access operation should operate under a transaction (REQUIRES). The problem is that policies or concerns are usually applied based on neither class nor class hierarchy. They are mostly random.
Scattering obj.lastModified = new Date(); Customer cust = new Customer(); … cust.lastModified = new Date(); saveCustomer(cust); Invoice inv = new Invoice(); … inv.lastModified = new Date(); saveInvoice(inv); Course crs = new Course(); … crs.lastModified = new Date(); saveCourse(crs);
Scattering: Modified obj.lastModifiedBy = currentUser(); obj.lastModified = new Date(); Customer cust = new Customer(); … cust.lastModifiedBy = currentUser(); cust.lastModified = new Date(); saveCustomer(cust); Invoice inv = new Invoice(); … inv.lastModifiedBy = currentUser(); inv.lastModified = new Date(); saveInvoice(inv); Course crs = new Course(); … crs.lastModifiedBy = currentUser(); crs.lastModified = new Date(); saveCourse(crs);
Tangling obj.lastModified = new Date(); Course crs = new Course(); … saveCourse(crs); logger.log(“Start operation”); logger.log(“Start operation”); tx = new Transaction(); tx.begin(); Course crs = new Course(); crs.id = generateUUID(); … crs.lastModified = new Date(); saveCourse(crs); tx.commit(); obj.id = generateUUID(); tx = new Transaction(); tx.begin(); … tx.commit();
Aspect-Oriented Programming Concerns are designed and implemented independently During build time or runtime, concerns are compiled into full functioned application. This process is called “weaving”.
AOP Definition Aspect Join Point Pointcut Advice
Join Point public void createCustomer() { x Customer cust = new Customer(); … saveCustomer(cust); }
Pointcut public void createCustomer() { x Customer cust = new Customer(); … saveCustomer(cust); }
Advice public void createCustomer() { logger.log(“Start create…”); Customer cust = new Customer(); cust.id = generateUUID(); … cust.lastModified = new Date(); saveCustomer(cust); }
AOP Proxy Caller Target Object Advice Proxy Advice Advice
Spring AOP
Supported Pointcuts execution within this target args
execution execution(<modifier> <return-type> <declaring-type> <method-name> (<param>) <throws>) execution(* *(..)) execution(public void set*(..)) execution(public * com.spring66.service.*.*(..)) execution(public * com.spring66.service..*.*(..))
within within(com.spring66.service.*) within(com.spring66.service..*)
Advice before after after-returning after-throwing around
Spring Transaction with AOP
Is that all? Q & A