Saturday, March 29, 2008

ADF Task Flows - Managing Transactions

You probably already know that ADF Task Flows are much more than simple page flow navigation. I was blogging previously on this topic, you can check - JDeveloper 11g and ADF Task Flow Parameters and ADF Task Flow in JDeveloper 11g. In this post I will describe how it's possible to manage transactions with ADF Task Flows.

Developed sample application - ADFTaskFlowTransactions.zip implements one transaction for Departments and Employees entities, this sample is based on HR schema from Oracle XE database.

How to understood transactions in ADF Task Flows? Basically speaking, ADF Task Flows allow to manage transactions declaratively in View layer. This means we can think about transactions in terms of forms available to the user. For example, if transportation information is entered into system through two screens - Source and Destination, transaction will be successful if both Source and Destination will be valid.

Sample application contains one main page and bounded task flow that implements transaction:


Transaction is opened from main page and is closed when control is returned back to main page.

If you will take closer look into bounded task flow that implements transaction, you will see here two pages and return activity defined. In updateDepartment page Department data is modified and in updateEmployees page Employees data is modified. Modified data is saved during return from bounded task flow:


Basic transaction for bounded ADF Task Flow is configured in two steps:

1. For bounded task flow, in Property Inspector tab, define transaction type in Behavior section. For my sample application I have defined new-transaction type.


2. Define behavior for task flow return activity. I have specified for Task Flow Return activity in Property Inspector tab, Behavior section, commit type for End Transaction property.


Both pages - updateDepartment and updateEmployees don't have Commit action defined in Page Definition files. This means that commit action isn't executed from those pages, it is executed only once when transaction is finished.

No Commit action defined in updateDepartmentPageDef.xml:


And there is no Commit action defined in updateEmployeesPageDef.xml as well:


How implemented transaction works? Transaction is opened from main page, where one of available locations is selected. During transaction, information about departments and employees from selected location will be updated:


Transaction is opened with first screen, where we can browse through and update information related to departments, from here we can open second step in transaction - information about employees update from selected department:


Second form is used to update information related to employees from selected department, here transaction is closed:

9 comments:

Anonymous said...

Hi Andrejus,
If i have a task Flow view which have a commandButton that calls a function that returns a string. ¿Must i put a return task flow? I do nothing with that string, but doesn´t work the function.
the function is a call to a PL/SQL function that modify a row in the data base.
Rowan

Andrej Baranovskij said...

Hi Rowan,

I guess you're talking about action method associated with button and returned String is a navigation link. You need to create Return activity with the same navigation link name as in your method.

Regards,
Andrejus

Unknown said...

Does this transaction functionality also work with EJB´s and jpa as your model or does it only work with Oracles own JBO type objects?

Andrej Baranovskij said...

Hi,

Didn't tested with EJB, but I assume it should work, since ADF Task Flow is in ViewController layer and this layer is separated from Model.

Regards,
Andrejus

Unknown said...

Thank you for the answer.

But when you create a DataControl for a EJB session bean there are no commit and rollback methods, are they not the ones used by the transactions in the task flow?

Andrej Baranovskij said...

Hi,

I have tested with JPA. This feature with JPA is not working - you are right.

Regards,
Andrejus

Wael Noaaman said...

Hi Andrejus ,
i have question
-at unbounded task flow :
why you defin input parameter locationIdParam although you didnt use it? (if i am right!)
- at bound task flow :
you defined pageflowScope.LocationId
and pass for it value of
pageflowScope.LocationId
so why you defined locationIdParam and didnt followed technique like you prevoious blog
TaskFlowParameter ?
Regards

Unknown said...

Hello Andrejus,
I have a very tricky scenario in my application and have been searching hard to find a solution. Can you help?

Hello,

Usecase :

Do crud operation on two tables from different schema's. Both schema's are accessed using single DB user credential via DB Link. Now when user tries to create a record on ADF UI, a transaction is initialised in ADF and at DB level in both schema. If user does nothing .....transaction time out is going to close the DB transaction in first schema... but how to handle the transaction in second schema which exist because of DB Link.


Thanks

Wesso said...

Hi Andrejus,

I want to know the difference between the types of transaction in 12c .
- no controller transaction
- always begin new transaction
- always use existing transaction
- use existing transaction if possible

Do you have a post explain that ? Kindly advise.