DB Adapter Locking Database Rows in Distributed Delete Polling Strategy

I am stuck with an issue. To explain the issue in simple steps
I am creating a Database Polling Adapter with Distributed Delete Polling Strategy in OSB for running in Clustered Environment.
We are custom SQL so that the records are not deleted after they are fetched but only a column Status Column is getting Updated.
The Polling query and Delete SQL is as follows
<query name="ReqJCAAdapterSelect" xsi:type="read-all-query">
<criteria operator="equal" xsi:type="relation-expression">
<left name="Status" xsi:type="query-key-expression">
<base xsi:type="base-expression"/>
</left>
<right xsi:type="constant-expression">
<value>READY</value>
</right>
</criteria>
<reference-class>ReqJCAAdapter.ItemTbl</reference-class>
<refresh>true</refresh>
<remote-refresh>true</remote-refresh>
<lock-mode>lock-no-wait</lock-mode>
<container xsi:type="list-container-policy">
<collection-type>java.util.Vector</collection-type>
</container>
</query>
<delete-query>
<call xsi:type="sql-call">
<sql>update ITEM_TBL
set STATUS = 'IN_PROCESS'
where ID = #ID</sql>
</call>
</delete-query>
In case of any error in Service Error handler the Status is being updated to ERROR.
Now the problem which I am facing is in the request Pipeline if we want to do any update on the same record we detect that in ROW is locked and is not allowed to do an update and because of this the process can not proceed.
Also if any error occurs in Request pipeline then from the Service Error handler we are supposed to Update the status as ERROR, but the same thing is happening and the process can not proceed.
but In the response Pipeline we can successfully update the status of the same record.
We have tried to use both XA and NON-XA Datasource but no luck.
Any help in this is appreciated.
Regards,
Dilip

I am stuck with an issue. To explain the issue in simple steps
I am creating a Database Polling Adapter with Distributed Delete Polling Strategy in OSB for running in Clustered Environment.
We are custom SQL so that the records are not deleted after they are fetched but only a column Status Column is getting Updated.
The Polling query and Delete SQL is as follows
<query name="ReqJCAAdapterSelect" xsi:type="read-all-query">
<criteria operator="equal" xsi:type="relation-expression">
<left name="Status" xsi:type="query-key-expression">
<base xsi:type="base-expression"/>
</left>
<right xsi:type="constant-expression">
<value>READY</value>
</right>
</criteria>
<reference-class>ReqJCAAdapter.ItemTbl</reference-class>
<refresh>true</refresh>
<remote-refresh>true</remote-refresh>
<lock-mode>lock-no-wait</lock-mode>
<container xsi:type="list-container-policy">
<collection-type>java.util.Vector</collection-type>
</container>
</query>
<delete-query>
<call xsi:type="sql-call">
<sql>update ITEM_TBL
set STATUS = 'IN_PROCESS'
where ID = #ID</sql>
</call>
</delete-query>
In case of any error in Service Error handler the Status is being updated to ERROR.
Now the problem which I am facing is in the request Pipeline if we want to do any update on the same record we detect that in ROW is locked and is not allowed to do an update and because of this the process can not proceed.
Also if any error occurs in Request pipeline then from the Service Error handler we are supposed to Update the status as ERROR, but the same thing is happening and the process can not proceed.
but In the response Pipeline we can successfully update the status of the same record.
We have tried to use both XA and NON-XA Datasource but no luck.
Any help in this is appreciated.
Regards,
Dilip

Similar Messages

  • Database Adapter using Logical Delete Polling Strategy not updating field

    I have an ESB database adapter defined against a table. The adapter is set to use the Logical Delete Polling Strategy, and the table has an extra column defined as the "delete" field. When I register the adapter to the ESB and add a record to the table, the adapter reads the contents of the record as expected. However, 15 seconds later (that being the polling interval) it reads it again, and again 15 seconds after that, ad infinitum.
    I have defined the logical delete field as a single character field and set the Read value for "T" (a record is normally inserted with that field having a null value). Results as outlined in the previous paragraph. I redefined the field as a number and set the Read value to "1" (with a record normally inserted with that field having a value of "0"). Results as outlined in the previous paragraph.
    Apparently the update of the logical delete value to the Read value is not occurring. My question (obviously) is: Why?
    Thanks for your time.

    Here is the adapter WSDL:
    <?xml version="1.0" encoding="UTF-8"?>
    <definitions
    name="Poll_PM_LOG"
    targetNamespace="http://xmlns.oracle.com/pcbpel/adapter/db/Poll_PM_LOG/"
    xmlns:tns="http://xmlns.oracle.com/pcbpel/adapter/db/Poll_PM_LOG/"
    xmlns:plt="http://schemas.xmlsoap.org/ws/2003/05/partner-link/"
    xmlns:jca="http://xmlns.oracle.com/pcbpel/wsdl/jca/"
    xmlns:pc="http://xmlns.oracle.com/pcbpel/"
    xmlns:top="http://xmlns.oracle.com/pcbpel/adapter/db/top/PollPMLOG"
    xmlns="http://schemas.xmlsoap.org/wsdl/">
    <types>
    <schema xmlns="http://www.w3.org/2001/XMLSchema">
    <import namespace="http://xmlns.oracle.com/pcbpel/adapter/db/top/PollPMLOG"
    schemaLocation="PollPMLOG_table.xsd"/>
    </schema>
    </types>
    <message name="LogCollection_msg">
    <part name="LogCollection" element="top:LogCollection"/>
    </message>
    <portType name="Poll_PM_LOG_ptt">
    <operation name="receive">
    <input message="tns:LogCollection_msg"/>
    </operation>
    </portType>
    <binding name="Poll_PM_LOG_binding" type="tns:Poll_PM_LOG_ptt">
    <pc:inbound_binding/>
    <operation name="receive">
    <jca:operation
    ActivationSpec="oracle.tip.adapter.db.DBActivationSpec"
    DescriptorName="PollPMLOG.Log"
    QueryName="Poll_PM_LOG"
    PollingStrategyName="LogicalDeletePollingStrategy"
    MarkReadFieldName="PROCESSED"
    MarkReadValue="T"
    SequencingFieldName="ID"
    MaxRaiseSize="1"
    MaxTransactionSize="unlimited"
    PollingInterval="15"
    NumberOfThreads="1"
    UseBatchDestroy="false"
    ReturnSingleResultSet="false"
    MappingsMetaDataURL="PollPMLOG_toplink_mappings.xml" />
    <input/>
    </operation>
    </binding>
    <service name="Poll_PM_LOG">
    <port name="Poll_PM_LOG_pt" binding="tns:Poll_PM_LOG_binding">
    <jca:address location="eis/DB/PM"
    UIConnectionName="PM"
    ManagedConnectionFactory="oracle.tip.adapter.db.DBManagedConnectionFactory"
    />
    </port>
    </service>
    <plt:partnerLinkType name="Poll_PM_LOG_plt" >
    <plt:role name="Poll_PM_LOG_role" >
    <plt:portType name="tns:Poll_PM_LOG_ptt" />
    </plt:role>
    </plt:partnerLinkType>
    </definitions>
    The field PROCESSED is defined as CHAR(1), and is normally null when a record is inserted. The value of the field is to be set to 'T' when the record is read by the polling adapter.

  • Rollback in database adapter with delete polling strategy

    Hi All,
    We have designed a database adapter with "Delete the Rows That Were Read" after read strategy with auto-retry attempts as 5. In BPEL process, where we are receiving the DB records, we are throwing a rollback fault in case of any fault.
    Database adapter polling is being re-tried 5 times in case of faults but the data is being deleted from the tables after 5 retries. Is this is the expected behavior of DB adapter? Doesn't the rollback fault rollback the complete transaction and leave the failed data back in the tables?
    Can any one provide more information on this polling strategy after the number of auto-retries are completed?.
    Thanks.
    -Pavan

    You need to include your bpel process in the same DB adapter transaction
    Use the following properties in the bpel component to do this
    <property name="bpel.config.transaction" type="xs:string" many="false">requiresNew</property>
        <property name="bpel.config.oneWayDeliveryPolicy" type="xs:string"
                  many="false">sync</property>
    Make sure the connection factory that you are using in the DB adapter is XA transaction enabled

  • DataBase Adapter Rollback option for Logical/Physical Delete in SOA  11g

    Hi All,
    We have a requirement where we need to rollback the logical delete performed by the DB Adapter (after polling a table) if there is any failure in the process down the line. We are trying to implement this using Mediator or OSB. For example if we are polling a table for changed records and performing logical delete, down the line if the business service (OSB) or the external reference (Mediator) are down/faulted, the records which were logically deleted are not getting rolled back in the table. Would any one please let me know if you have come across the same kind of scenario?
    Is there any property we need to set while configuring the polling DB Adapter?
    Thank You.

    Thank you very much for the reply Anuj,
    I have created a db adapter which polls on a table with logicaldeletestrategy in JDeveloper 11g,
    then I imported the XSD, mapping.xml, wsdl and JCA file into OSB using OSB consol. In the console
    I generated proxy and wsdl for that proxy using JCA file. Then created one more db adapter in JDev
    which inserts the records polled by the first db adapter into another table, followed the same
    process of importing the above mentioned 4 files and generated a business service. In proxy service
    route node I am using a transformation (which also I imported from Jdev) to route the data polled
    by proxy service to the business service. Here I am using an XA datasource both the JCA's also
    I made the 3 changes reccommended by Arun but still I am not getting the results.
    I tried physical delete same issue with that too. When I am doing physical delete the proxy service
    atleast picking up the records and deleting them. But when I tried logical delete the proxy is not even
    picking up the records. Am I missing anything here?
    Thank You,
    Edited by: user12237005 on Apr 7, 2011 2:17 PM

  • How DB adapter works when polling strategy is "remove row selected"?

    How DB adapter works when polling strategy is "delete the rows that were read"?
    I want to know how database adapter works when polling startegy is "remove row".This polling strategy helps for polling the changes to table and remove records after new records are inserted or changes are done to table.Here,i want to understand how DB adapter identifies which record to be deleted.
    For example: there is a table with 100 recorrds.How DB adapter works when polling strategy is "delete the rows that were read"?
    I want to know how database adapter works when polling startegy is "delete the rows that were read".This polling strategy helps for polling the changes to table and remove records after new records are inserted or changes are done to table.Here,i want to understand how DB adapter identifies which record to be deleted.
    For example:
    There is a table EMP with 100 recorrds.Now, i deploy a BPEl process with db adapter polling on table EMP for changes.So that ,if any change happen to records in table that records will be picked up.I use a polling startegy "delete the rows that were read" .
    Now i insert 9 new records and update one existing records.These 10 records should be picked up and then deleted by Db adapter.In this 109 records how DB adapter identifies these 10 records when it polls.How it differentiatess old records with new records when there is no flag field or no sequence id used to identify the new or modified records.
    Please let me know.
    Why i want to know this?
    Some times customer may not allow BPEL process to do any modifications to source table or source database.In this case the options provided by database adapter wizard are not useful.
    If there is any mechanism to identify new or modified records without having a FLAG field or sequence table,then it is possible to have an option like only read the changes from table rather than deleting the records after reading.Which helps in meeting above requirement.
    Please let me know if there is any way to do this.
    thanks
    Arureddy

    Once the record has been read it is deleted. Therefore, you can update rows in this table as many times you like before it is read. Once it is read there will be nothing to update as it will be deleted.
    If you don't want to use a sequence table, you can use a sequence file. You can only use this functionality if the key you are using increments sequentially. e.g. 1,2,3,4. If your key is random, e.g. 2,1,3,5,7,4 then your options are delete or use a processing flag.
    The other option is to create a trigger that inserts a key into a polling table when insert or updates occur. You can then use the delete, which is the most desirable as it uses database locking.
    cheers
    James

  • Row is not deleted when check box is selected urgent please

    my problem is, i am creating number of rows dynamicaly and storing the values in the database. I do have one delete check box. if the user checked that box that row should be deleted. I am using array to return the check box values. It is working fine when there is multiple rows.. suppose if i do have only one row and trying to delete that row i am getting an exception. Please help me to solve this issue, here ismy jsp
    <%@page language="java" import="java.lang.*, java.sql.*, java.io.*,
    java.util.*"%>
    <%@ page import="DatabaseConnection"%>
    <%@ page import="AdjustmentsBean"%>
    <%@ page import="AdjustmentTransactionInfo"%>
    <%@ page import="CustomerLocationInfo"%>
    <%@ page import="EmersonGlobalConstants"%>
    <%@ page import="CallPLSQLFunc"%>
    <%@include file="Security.jsp" %>
    <%
    AdjustmentsBean adjustments = new AdjustmentsBean();
    String userName=(String)session.getAttribute("user_name");
    String divisionCode=(String)session.getAttribute("division_code");
    String divisionName=(String)session.getAttribute("division_code_name");
    if(userName==null){userName="";}
    if(divisionCode==null){divisionCode="";}
    if(divisionName==null){divisionName="";}
    GregorianCalendar calendar = (GregorianCalendar)Calendar.getInstance();
    CallPLSQLFunc callPLSQLFunc = new CallPLSQLFunc();
    Vector months = callPLSQLFunc.getMonths(divisionCode);
    String cMonth = callPLSQLFunc.getCurrentMonth(divisionCode);
    System.out.println("%%%%%%%%%" +months);
    //int mm = calendar.get(Calendar.MONTH) + 1;
    //int yyyy = calendar.get(Calendar.YEAR);
    if(months ==null){
    months=new Vector();
    int mmst=0;
    int yyst=0;
    if(months.size()>=1){
    //mmst=Integer.parseInt(new String(((String)months.get(0)).charAt(0)));
    mmst=Integer.parseInt(String.valueOf(((String)months.get(0)).charAt(0)));
    yyst=Integer.parseInt(((String)months.get(0)).substring(3,6));
    StringTokenizer token1 = new StringTokenizer(cMonth,"-");
    yyst=Integer.parseInt(token1.nextToken());
    mmst=Integer.parseInt(token1.nextToken());
    int ddst = Integer.parseInt(token1.nextToken());
    String currentDate= (mmst<10?"0"+mmst:mmst+"") + "/" + yyst;
    System.out.println("The current date is" + currentDate);
    String slectedMonth = request.getParameter("selectedMonth");
    String selectedDate=currentDate;
    if(slectedMonth != null && slectedMonth.trim().length()>0){
    selectedDate=slectedMonth;
    boolean modifyAllowed=false;
    if(selectedDate.equalsIgnoreCase(currentDate)){
    modifyAllowed=true;
    String admin=(String)session.getAttribute("admin");
    if(admin==null){admin="false";}
    if(admin.equalsIgnoreCase("true") ){
    modifyAllowed=true;
    %>
    <%
    Vector transactions = adjustments.getTransactionsOfMonth(selectedDate,divisionCode);
    Vector customers = adjustments.getAllCustomers();
    System.out.println("customers : "+customers.size());
    %>
    <html>
    <head>
    <script>
    var modifyAllowed;
    if(<%=modifyAllowed%> == true){
    modifyAllowed = '';
    }else{
    modifyAllowed = 'disabled';
    var EAS_Cust_Loc_Num_Key = new Array(<%=customers.size()%>);
    var EAS_Cust_Num_Key = new Array(<%=customers.size()%>);
    var EAS_Cust_Num = new Array(<%=customers.size()%>);
    var EAS_Cust_Name = new Array(<%=customers.size()%>);
    var customerWiseLocationNumKey = new Array(<%=customers.size()%>);
    var customerWiseLocationName = new Array(<%=customers.size()%>);
    <%
    for(int i=0;i<customers.size();i++){
    CustomerLocationInfo cl = (CustomerLocationInfo)customers.get(i);
    %>
    EAS_Cust_Loc_Num_Key[<%=i%>] = "<%=cl.getEAS_Cust_Loc_Num_Key()%>";
    EAS_Cust_Num_Key[<%=i%>] = "<%=cl.getEAS_Cust_Num_Key()%>";
    EAS_Cust_Num[<%=i%>] = "<%=cl.getEAS_Cust_Num()%>";
    EAS_Cust_Name[<%=i%>] = "<%=cl.getEAS_Cust_Name()%>";
    var locationNumKey = new Array(<%=cl.getLocations().size()%>);
    var locationName = new Array(<%=cl.getLocations().size()%>);
    <%
    int j=0;
    Enumeration enum = cl.getLocations().keys();
    while(enum.hasMoreElements()){
    String s = (String)enum.nextElement();
    String name = (String)cl.getLocations().get(s);
    %>
    locationNumKey[<%=j%>]="<%=s%>";
    locationName[<%=j%>]="<%=name%>";
    <%
    j=j+1;
    %>
    customerWiseLocationNumKey[<%=i%>] = locationNumKey;
    customerWiseLocationName[<%=i%>] = locationName;
    <%
    %>
    function changeMonth(){
    window.document.adjustmentForm.action="Adjustments.jsp";
    adjustmentForm.submit();
    function populateLocation(id){
    var table = document.getElementById('myTable');
    var rows = table.rows.length-2;
    var theForm = document.forms[0];
    var wRow = theForm["location"];
    var wCustRow = theForm["customer"];
    var len;
    var locobj ;
    var custobj ;
    if(rows ==1){
    locobj =wRow;
    }else{
    locobj =wRow[id];
    if(rows ==1){
    custobj =wCustRow;
    }else{
    custobj =wCustRow[id];
    len = locobj.options.length;
    locobj.selectedIndex=0;
    for(z=0;z<len;++z){
    locobj.options[z] = null;
    locobj.options.length=0;
    locobj.options[0] = new Option("Select Any Location");
    var cIndex = custobj.selectedIndex;
    if(cIndex !=0){
    for(i=1;i<=customerWiseLocationName[cIndex-1].length;i++){
    locobj.options = new Option(customerWiseLocationName[cIndex-1][i-1],customerWiseLocationNumKey[cIndex-1][i-1]);
    function addRow(id){
    var table = document.getElementById(id);
    var sHTML = new Array() ;
    var cus = "<select name=customer onChange='javascript:populateLocation("+(table.rows.length-2)+")'"+modifyAllowed+"><OPTION VALUE=''>Select Any Customer</OPTION>";
    var options;
    for(i=0;i<EAS_Cust_Num.length;i++){
    options = options+"<OPTION VALUE='" + EAS_Cust_Num +"'>" + EAS_Cust_Name + "</OPTION>";
    cus=cus+options+"</select>";
    sHTML[0] = "<input type=checkbox name=chk "+modifyAllowed+" onClick=changedisable("+(table.rows.length-2)+")><input type=hidden name=adid value='' ><input type=hidden name=isdelete value='false'>";
    sHTML[1] = cus;
    sHTML[2] = "<select name='location'"+modifyAllowed+"><OPTION VALUE=''>Select Any Location</OPTION>";
    sHTML[3] = "<input type=text size=10 maxlength=40 name=sku"+modifyAllowed+"> <input type=button value=Search onClick=window.open('SearchSKU.jsp?cnt="+(table.rows.length-2)+"','SearchSKU','width=350,height=350,top=150,left=150,scrollbars=yes')>";
    sHTML[6] = "<input type=hidden name=shipnotbilled "+modifyAllowed+" onClick=changeisshipnotbilled("+(table.rows.length-2)+")><input type=hidden name=isshipnotbilled value='false'>";
    sHTML[4] = "<input type=text size=10 maxlength=40 name=units "+modifyAllowed+">";
    sHTML[5] = "<input type=text size=10 maxlength=40 name=amount "+modifyAllowed+">";
    var newRow = table.insertRow(-1);
    var sHTMLIndex = sHTML.length ;
    for(i=0;i<sHTMLIndex;i++) {
    var newCellSelect = newRow.insertCell(-1);
    newCellSelect.innerHTML = sHTML;
    function validate(){
    var table = document.getElementById('myTable');
    var theForm = document.forms[0];
    var wRow = theForm["amount"];
    var custRow = theForm["customer"];
    var locRow = theForm["location"];
    var quantityRow = theForm["units"];
    var count = table.rows.length;
    var rows = table.rows.length-2;
    var obj;
    if(rows==1){ //only one row..
    if(wRow.value==""){
    alert("Amount field is mandatory. Please fill in amount");
    return false;
    if(custRow.selectedIndex==0){
    alert("Customer is mandatory. Please select the customer");
    return false;
    if(locRow.selectedIndex==0){
    alert("Location is mandatory. Please select the location");
    return false;
    if(! isAmount(wRow.value) ){
    alert("Amount is numeric. Please enter numeric value for amount");
    return false;
    if(!isQuantity(quantityRow.value)){
    alert("Quantity is numeric. Please enter numeric value for quantity");
    return false;
    }else{ //this means more than one rows..
    for(i=0;i<count-2;i++){
    if(wRow.value==""){
    alert("Amount field is mandatory. Please fill in amount for transaction no "+(i+1));
    return false;
    if(wRow.value== 0){
    alert("Please fill non zero value for Amount "+(i+1));
    return false;
    if(custRow.selectedIndex==0){
    alert("Customer is mandatory. Please select the customer for transaction no "+(i+1));
    return false;
    if(locRow.selectedIndex==0){
    alert("Location is mandatory. Please select the location for transaction no "+(i+1));
    return false;
    if(! isAmount(wRow.value) ){
    alert("Amount is numeric. Please enter numeric value for amount of transaction no "+(i+1));
    return false;
    if(!isQuantity(quantityRow.value)){
    alert("Quantity is numeric. Please enter numeric value for quantity of transaction no "+(i+1));
    return false;
    if(quantityRow.value== 0){
    alert("Please fill non zero value for Units "+(i+1));
    return false;
    return true;
    function isQuantity(value){
    for (k=0;k<value.length;k++){
    if(k==0){
    if(!(value.charAt(k)>=0 && value.charAt(k)<=9) ){
    if(value.charAt(k)!='-'){
    break;
    }else{
    if(!(value.charAt(k)>=0 && value.charAt(k)<=9)){
    break;
    if(k == value.length){
    return true;
    }else{
    return false;
    function isAmount(value){
    for (k=0;k<value.length;k++){
    if(k==0){
    if(!(value.charAt(k)>=0 && value.charAt(k)<=9) ){
    if(value.charAt(k)!='-'){
    break;
    }else{
    if((!(value.charAt(k)>=0 && value.charAt(k)<=9)) ){
    if(value.charAt(k) !='.'){
    break;
    if(k == value.length){
    return true;
    }else{
    return false;
    function changedisable(index){
    if(document.adjustmentForm.chk[index].checked){
    document.adjustmentForm.isdelete[index].value='true';
    }else{
    document.adjustmentForm.isdelete[index].value='false';
    function changeisshipnotbilled(index){
    if(document.adjustmentForm.shipnotbilled[index].checked){
    document.adjustmentForm.isshipnotbilled[index].value='true';
    }else{
    document.adjustmentForm.isshipnotbilled[index].value='false';
    function backtoHome(){
    window.document.adjustmentForm.action="Welcome.jsp";
    adjustmentForm.submit();
    function setData(cnt,num){
    var table = document.getElementById('myTable');
    var rows = table.rows.length-2;
    if(rows==1){
    window.document.adjustmentForm.sku.value=num;
    }else{
    window.document.adjustmentForm.sku[cnt].value=num;
    </script>
    <link rel="stylesheet" type="text/css" href="main.css" />
    <%= EmersonGlobalConstants.TITLE %>
    </head>
    <body class="trAppId1" alink="blue" vlink="blue" link="blue">
    <form name="adjustmentForm" method="get" action="AdjustmentServlet"
    target="display">
    <center>
    <br>
    Manual Sales Application
    <br>User Name: <%=userName%>, Division Code: <%=divisionCode%>,
    Division Name: <%=divisionName%>
    <br>
    <br><br><br>
    <b>Date: </b>
    <Select name="selectedMonth" onChange="javascript:return changeMonth();">
    <%
    for(int i=0;i<months.size();i++){
    String mon = (String)months.get(i);
    System.out.println("mon *********** : "+mon);
    //mmst=Integer.parseInt(new String(((String)months.get(i)).charAt(0)));
    mmst=Integer.parseInt(String.valueOf(((String)months.get(i)).charAt(0)));
    yyst=Integer.parseInt(((String)months.get(i)).substring(3,6));
    out.println("<option value='"+ (mmst<10?"0"+mmst:mmst+"") + "/" + yyst+"' "+(selectedDate.equalsIgnoreCase((mmst<10?"0"+mmst:mmst+"") + "/" + yyst)?"selected":"") +">"+getMonth(mmst) + ", " + yyst+"</option>");
    for(int i=0;i<months.size();i++){
    String mon = (String)months.get(i);
    StringTokenizer token = new StringTokenizer(mon,"/");
    String mmm= token.nextToken();
    String yyy= token.nextToken();
    System.out.println("mon *********** : "+mon);
    mmst=Integer.parseInt(mmm);
    yyst=Integer.parseInt(yyy);
    System.out.println("selectedDate**** "+selectedDate);
    out.println("<option value='"+ (mmst<10?"0"+mmst:mmst+"") + "/" + yyst+"' "+(selectedDate.equalsIgnoreCase((mmst<10?"0"+mmst:mmst+"") + "/" + yyst)?"selected":"") +">"+getMonth(mmst) + ", " + yyst+"</option>");
    %>
    </select>
    <br><br>
    </center>
    <table id="myTable" class="tableForm" border="1" cellpadding="1" cellspacing="1" width="100%" align="center">
    <tr class="trFormHead"><td colspan="7"> Adjustment Transactions</td></tr>
    <tr>
    <td width = 2%><b>Delete</b></td>
    <td width = 25% align=center><b>Customer<font color=red> *</font></td>
    <td width = 25% align=center><b>Location<font color=red> *</font></td>
    <td width = 20% align=center><b>SKU<font color=red> *</font></td>
    <!-- <td width = 5% align=center><b>SNB</td> -->
    <td width = 9% align=center><b>Units<font color=red> *</font></td>
    <td width = 9% align=center><b>Amount<font color=red> *</font></td>
    </tr>
    <%
    int index=0;
    AdjustmentTransactionInfo transacrionInfo;
    for(;index<transactions.size();index++){
    transacrionInfo = (AdjustmentTransactionInfo)transactions.get(index);
    %>
    <input type=hidden name=adid value='<%=transacrionInfo.getAdjustmentId()%>' >
    <TR>
    <td><input type=checkbox name=chk <%=modifyAllowed?"":"disabled"%> onClick=changedisable(<%=index%>) >
    <input type=hidden name=isdelete value='false'></td>
    <td >
    <select name=customer <%=modifyAllowed?"":"disabled"%> onChange='javascript:populateLocation(<%=index%>)' >
    <OPTION VALUE="">Select Any Customer</OPTION>
    <%
    for(int i=0;i<customers.size();i++){
    CustomerLocationInfo cl =(CustomerLocationInfo)customers.get(i);
    //this is done considering that EASCustLocNum of transaction is same as EAS_Cust_Loc_Num_Key of customer table.
    String selected = cl.getLocations().containsKey(transacrionInfo.getEASCustLocNum())?"selected":"";
    out.println ("<OPTION VALUE='" + cl.getEAS_Cust_Num() + "'"+selected+">" + cl.getEAS_Cust_Name() + "</OPTION>");
    %>
    </select>
    </td>
    <td>
    <select name="location" <%=modifyAllowed?"":"disabled"%> >
    <OPTION VALUE="">Select Any Location</OPTION>
    <%
    for(int i=0;i<customers.size();i++){
    CustomerLocationInfo cl = (CustomerLocationInfo)customers.get(i);
    if(cl.getLocations().containsKey(transacrionInfo.getEASCustLocNum())){
    Hashtable locations = cl.getLocations();
    Enumeration enum = locations.keys();
    while(enum.hasMoreElements()){
    String key =(String)enum.nextElement();
    out.println ("<OPTION VALUE='" + key +"'"+(key.equalsIgnoreCase(transacrionInfo.getEASCustLocNum())?"selected":"")+">"+ locations.get(key) + "</OPTION>");
    %>
    </select>
    </td>
    <td>
    <script>
    function openURL(URL,windowName){
    </script>
    <input type=text size=10 maxlength=40 name=sku value="<%=transacrionInfo.getProductionSKUNum()%>"<%=modifyAllowed?"":"disabled"%> >
    <input type=button value="Search"onclick="javascript:window.open('SearchSKU.jsp?cnt=<%=index%>', 'SearchSKU', 'width=350,height=350,top=150,left=150,scrollbars=yes');">
    </td>
    <!--
    <td>
    <input type="checkbox" name="shipnotbilled" <%=transacrionInfo.getShipNotBilled()?"checked":""%><%=modifyAllowed?"":"disabled"%> onClick=changeisshipnotbilled(<%=index%>)><input type=hidden name=isshipnotbilled value='<%=transacrionInfo.getShipNotBilled()?"true":"false"%>'>
    </td>
    -->
    <input type=hidden name="shipnotbilled" <%=transacrionInfo.getShipNotBilled()?"checked":""%> <%=modifyAllowed?"":"disabled"%> onClick=changeisshipnotbilled(<%=index%>) ><input type=hidden name=isshipnotbilled value='<%=transacrionInfo.getShipNotBilled()?"true":"false"%>'>
    <td>
    <input type="text" size="10" name="units" value="<%=transacrionInfo.getAdjustmentQty()%>"<%=modifyAllowed?"":"disabled"%> >
    </td>
    <td>
    <input type="text" size="10" name="amount" value="<%=transacrionInfo.getAdjustmentAmt()%>" <%=modifyAllowed?"":"disabled"%> >
    </td>
    </tr>
    <%
    /*if(transactions== null || transactions.size()==0){
    out.println ("<tr><td></td><td colspan=6 align =
    center><b> Transactions not available</b></td></tr>");
    %>
    </Table>
    <br>
    <br>
    <%
    if(modifyAllowed){
    %>
    <b>AddTransaction</b>
    <br><b>Transactions marked will be deleted on submit</b>
    <br>
    <b>Fields marked with <font color=red>*</font> are mandatory.</b>
    <%
    %>
    <center>
    <br>
    <%
    if(modifyAllowed){
    %>
    <input type=submit value="Submit Form!" onClick='javascript:return validate()'>
    <%
    }else{
    %>
    <input type=button value="Back to Home Page" onClick='javascript:backtoHome()'>
    <%
    %>
    </center>
    </form>
    <br><hr>
    </body>
    </html>
    <%!
    String getMonth(int month){
    switch(month){
    case 1:
    return "JAN";
    case 2:
    return "FEB";
    case 3:
    return "MAR";
    case 4:
    return "APR";
    case 5:
    return "MAY";
    case 6:
    return "JUN";
    case 7:
    return "JUL";
    case 8:
    return "AUG";
    case 9:
    return "SEP";
    case 10:
    return "OCT";
    case 11:
    return "NOV";
    case 12:
    return "DEC";
    return "JAN";
    %>

    I haven't read your code, but can make a guess at what's going wrong. Checkboxes do behave in a weird manner depending upon whether you have selected one or many.
    Assuming this is the statement where you are generating the checkbox :
    <input type="checkbox" name="checkBoxName" value="<%= someValue %>">
    What you could do is read the checked checkBoxes in an array :
    String[] values = request.getParameterValues("checkBoxName");
    int sizeOfValues = values.length;
    Then use the sizeOfValues to perform your delete action :
    if (sizeOfValues==1)
         performDelete();
    else
         for (int i=0; i<sizeOfValues(); i++)
              performDelete();
    Hope this technique works.

  • How to find who has locked a row in a table?

    My DB is a Oracle Database 10g Enterprise Edition Release 10.2.0.4.0.
    My question is very simple: You try to update a row of a table but find out it is locked by somebody else.
    How do I find which user (or session) has locked that row?

    SELECT Decode(request, 0, 'Holder: ',
                           'Waiter: ')
           ||vl.sid sess,
           status,
           id1,
           id2,
           lmode,
           request,
           vl.TYPE
    FROM   v$lock vl,
           v$session vs
    WHERE  ( id1, id2, vl.TYPE ) IN (SELECT id1,
                                            id2,
                                            TYPE
                                     FROM   v$lock
                                     WHERE  request > 0)
           AND vl.sid = vs.sid
    ORDER  BY id1,
              request

  • How to lock a row in a db2/400

    Hi all,
    Could someone show me how to lock a row in the database DB2/400
    The scenario:
    DB.beginTransaction
    User 1 gets a row with a column bill_number
    "select bill_number from numbers where pk = xxx for update"
    aux_bill_number = bill_number
    USER 1 updated this row
    "update numbers set bill_number = bill_number +1 where pk = xxx "
    USER 1, like final step, insert aux_bill_number in other table as primary key
    DB.commitTransaction
    While doing so,
    User 2 also gets a row with a bill_number. this user must take bill_number with value 2, but take the same value 1
    This it causes key duplicated in the destiny table.
    Please, help me.
    How I must lock the row not to allow to read until finishing the previous transaction?

    Hi all,
    Could someone show me how to lock a row in the
    database DB2/400Isn't SELECT FOR UPDATE standard?
    >
    The scenario:
    DB.beginTransaction
    er 1 gets a row with a column bill_number
    "select bill_number from numbers where pk =
    xxx for update"
    aux_bill_number = bill_number
    1 updated this row
    "update numbers set bill_number = bill_number
    +1 where pk = xxx "
    USER 1, like final step, insert aux_bill_number in
    other table as primary key
    DB.commitTransactionSounds like you're trying to do something that a JOIN would do better.
    While doing so,
    User 2 also gets a row with a bill_number. this user
    must take bill_number with value 2, but take the
    same value 1
    This it causes key duplicated in the destiny table.
    Please, help me.
    How I must lock the row not to allow to read until
    finishing the previous transaction?Setting the isolation level to SERIALIZABLE might help.
    %

  • How to pre - load all database rows into cache

    Hi All,
    The below is my cache configuration, I would like to know how to load all the database rows/specified number of rows into the cache.
    <?xml version="1.0"?>
    <!DOCTYPE cache-config SYSTEM "cache-config.dtd">
    <cache-config>
    <caching-scheme-mapping>
    <cache-mapping>
    <cache-name>TableEmp</cache-name>
    <scheme-name>distributed-hibernate</scheme-name>
    <init-params>
    <init-param>
    <param-name>entityname</param-name>
    <param-value>com.tangosol.examples.explore.Emp</param-value>
    </init-param>
    </init-params>
    </cache-mapping>
    </caching-scheme-mapping>
    <caching-schemes>
    <distributed-scheme>
    <scheme-name>distributed-hibernate</scheme-name>
    <backing-map-scheme>
    <read-write-backing-map-scheme>
    <internal-cache-scheme>
    <local-scheme></local-scheme>
    </internal-cache-scheme>
    <cachestore-scheme>
    <class-scheme>
    <class-name>
    com.tangosol.coherence.hibernate.HibernateCacheStore
    </class-name>
    <init-params>
    <init-param>
    <param-type>java.lang.String</param-type>
    <param-value>{entityname}</param-value>
    </init-param>
    </init-params>
    </class-scheme>
    </cachestore-scheme>
    </read-write-backing-map-scheme>
    </backing-map-scheme>
    </distributed-scheme>
    </caching-schemes>
    </cache-config>
    Please kindly provide a solution.
    Regards
    S

    Hi Rich,
    Imagine I have just downloaded coherence, I have run a server with the default config. From what you said to S coherence can pull the data from database itself WITHOUT me having to push it to coherence? If so can you please explain how this done, or point me at a guide?You might start with [Read-Through Caching|http://coherence.oracle.com/display/COH34UG/Read-Through%2C+Write-Through%2C+Write-Behind+and+Refresh-Ahead+Caching#Read-Through%2CWrite-Through%2CWrite-BehindandRefresh-AheadCaching-ReadThroughCache] to understand how Coherence can pull data. It is the implementation of a CacheLoader that enables the Coherence cache to pull the data.
    The cache configuration that S provided specifies a read-write-backing-map-scheme indicating that HibernateCacheStore class should be used by Coherence and is similar to the configuration discussed at [Using Hibernate as a CacheStore for Coherence|http://wiki.tangosol.com/display/COH34UG/Using+Hibernate+as+a+CacheStore+for+Coherence]. In responding to the original question, I was assuming that the data source being queried to be loaded into the cache is the same as the data source fronted by the Hibernate configuration.
    Secondly with the respects to the answer to my question. If I don't care about versioning ... do I need a EvolvablePortableObject? If you really don't want to version your serialized representations, you can implement the PortableObject interface instead but the additional cost of implementing EvolvablePortableObject is small and the potential benefit is great.
    So my question is, can coherence pull the data from the database using a preload request and serialize into a pof format without me having to push the data to coherence via a separate app? And if so could you please explain how? Or direct me at some documentation?You do not need to push data to Coherence via a separate app. Coherence can pull the data from the database. Coherence can also preload the cache using an EntryProcessor. You can configure Coherence to use POF and will need to implement POF serialization methods for your cache objects.
    The [Partitioned cache with a serializer|http://coherence.oracle.com/display/COH34UG/Sample+Cache+Configurations#SampleCacheConfigurations-Partitionedcacheofadatabase] example and the links it provides should provide sufficient documentation for configuring and using POF.
    Whether you decide to use the HibernateCacheStore, the TopLinkCacheStore or implement your own CacheStore or CacheLoader class to access your data in your database is your decision. You should be able to find sufficient documentation and examples to help you decide how you would like to use Coherence at the [Coherence Knowledge Base|http://wiki.tangosol.com/display/COH/Oracle+Coherence+Knowledge+Base+Home]. I would recommend starting with the [User Guide|http://wiki.tangosol.com/display/COH34UG/Coherence+3.4+Home] if you would like to get a better grasp of the overall architecture.
    Regards,
    Harv

  • EjbRemove, remove(), bean logic, database row logic

    In some Sun examples the remove() method is not exposed trhu the home interface, but anyway it is called from the client thru the home interface, I would like to know the reason; another question is the logic after the remove() method exposed thru the remote interface versus the ejbRemove() method exposed (?) thru the home interface, so the question is:
    - there is a logic directed to the bean (to delete de entity bean) and another logic directed to the persistent row represented by the bean?.
    If I delete a row it is obvious the entity bean representing it should be deleted, but what happens if the client (or the container) invokes ejbRemove() either directly (the container) or trhu the home interface (the client) and I only want to delete the bean, but not the persistent row? Iin fact, the container could call ejbRemove as part of the bean lifecycle, and this should not imply the persistent database row delete, so it appears that the row delete code should not be in the ejbRemove() ?!
    thanks.

    I think that that the removing of an entity ejb should not imply the removing of the database row, thought the remove of the database row really implies the removing of the entity ejb representation. So, if you code an sql delete statement in the ejbRemove method, it implies that as consequences of the lifecycle of ten entity bean the row could be removed, and I think it is not allway rihgt, for if you want to remove the ejb representing your account (for example), to free server memory, it should not imply that yout account database row should be removed too, unless the ejbRemove method woulnd't be never called by the container, so, to cut it short: what happens if the container, as a consequence of the lifecycle of the bean, call ejbRemove and you coded in this method a sql delete, your account (for example) in your bank would dissapppear!, and you only wanted to free the memory associated to the entity ejb.
    I think the remove() and ejbRemove() are tricky!
    Maybe I don't understand well the basics of ejb, but I really thought a lot about this question.
    thanks!

  • Adapter Lock Testing

    Dear All
    We had an issue in our production environment where a critical interface involving sender JDBC adapter stopped working, the reason was the adapter service $XIDBAD.JDBC2XI was locked. It was then manually unlocked in NWA ->locks.
    We raised an OSS note with SAP and they suggested some paremeters and patches for the permanent solution. Now when we have applied these parameters we need to test and verify the solution...
    We have two options
    1. We start the interface and wait for a time when lock happens ( which could be rare/impossible after applying the changes)
    2. we force a lock on the service  $XIDBAD.JDBC2XI ....
    Is there anyway where we can utilize the option 2
    regards
    Sourabh

    At times JDBC adapter could be heavyly loaded or PI is high on Java Threads might cause the JDBC adapter lo get locked in NWA. Some times it could be network issues reaching the host as well.
    Then this happens the adapter starts to process but never completes.
    As of now we know the remedy to this as to unlock it in NWA but nothing else. :-(.
    in case you monitoring channel show  something like this:
    1/23/08 4:06:26 PM Processing started
    1/23/08 4:06:11 PM Processing started
    1/23/08 4:05:56 PM Processing started
    1/23/08 4:05:41 PM Processing started
    1/23/08 4:05:26 PM Processing started
    1/23/08 4:05:11 PM Processing started
    1/23/08 4:04:56 PM Processing started
    1/23/08 4:04:41 PM Processing started
    Possible solution:
    Either there is no data in the Database that confirms to the Query in sender jdbc adapter or , some network issues as pointed.
    The solution for network issues is to select option "Disconnect From Database after each message processing"
    If the JDBC adapter is going to be pulling data out from a Database every 10 secs, its gonna be a lot of data that is going through XI.
    have a look at SAP Note 1083488 and see if it helps
    also Two channel can poll data but should not try to change the data as it would lead to some consistency or locking issues..!! It might cause the adapter locked!!
    Edited by: Rodrigo Alejandro Pertierra on Apr 6, 2011 11:38 AM
    take a look to:
    why JDBC adapter locking
    problem with jdbc adapter
    JDBC sender adapter is polling but not picking up any data --> particular this
    there are many thread realated to this error in SDN, some are those. incase or more datails  search by "JDBC adapter locked"
    page 2

  • How can i explicitly lock a row of a Table

    Hi
    How can we implement optimistic locking , i am using Oracle as Database for my Application .
    Assume that i am working on a single row of a Table .
    Now please tell me how can i explicitly lock this row , so that other simultanoues users insert or update operations are not affected to this particular row .
    I am not using any ORM related technology
    Please help .

    raviprivate wrote:
    Hi
    How can we implement optimistic locking , i am using Oracle as Database for my Application .
    Assume that i am working on a single row of a Table .
    Now please tell me how can i explicitly lock this row , so that other simultanoues users insert or update operations are not affected to this particular row .Either you want optimistic locking which does not use (database) locks at all, or you want pessimistic locking which does use database locks.
    In optimistic locking everyone is allowed to read and to update without taking out a lock. Usually the optimistic lock is realised by including either a 'version' or 'last_modified' column which with every update is either increased (version) or set to the current_timestamp (last_modified). The update statement must be issued with a condition including that column (eg UPDATE ... WHERE id=<id> AND version=<version at time of read>). If the column was already changed by another user or process zero rows will have been updated signalling to the program that another user already changed the row and the user must redo his changes, or a more complex method of change comparison can be done.

  • How to lock a row and release lock

    Hello
    There are two thread, they read the same row, I want to lock this row when the first thread read the record, after this thread commit its data, release the lock, the second thread can lock this record, also can commit its data. I also want to know how to release the lock. And these operations are in different Classes, e.g. in Class A first thread lock the record, in Class B second lock the record, and in Class C release the lock.
    Note: these two thread will read this record at same time.
    Thanks in advance.

    TopLink provides to forms of locking, optimistic and pessimistic.
    <p>
    You are referring to pessimistic. You can use pessimistic locking in TopLink through the ReadObject/ReadAllQuery API acquireLocks(), or acquireLocksWithoutWaiting(), this will use a "Select ... for Update" in SQL. You must be in a transaction to lock a row in the database (UnitOfWork in TopLink), and you locks are released when you commit or rollback the transaction. If you are using JPA, TopLink supports a JPA query hint "toplink.pessimistic-lock"="Lock" to allow pessimistic locking.
    <p>
    You can also use optimistic locking. An optimistic lock does not prevent another user from reading the same row, but ensures that only one user will be able to commit changes to the row. Optimistic locking typically has the advantage of better concurrency, and does not have issues with deadlocks.
    <p>---
    <br>James Sutherland
    <br>Oracle TopLink, EclipseLink
    <br>Wiki: Java Persistence, EclipseLink

  • Is executeQuery() locking the rows?

    Hi,
    Is executing the following statements lock the rows in database even if myView is a sql_only view? On the other words is executeQuery() locking the rows implicitly?
    myView.setWhereClause(....where clause...);
    myView.executeQuery();
    please advice.Thanks.

    Steven, That's good for me to hear this performance problem is not coming from the executeQuery() method. Let me explain more about this, maybe this is something in application module setting that I am not aware of that.
    I have a jsp page, that gets view object name as a parameter. At the top of this page an application module and the view object instantiated using tags approach. Then the java code reads all the columns from the view using myView.getAttributeDefs() and
    Shows the columns name along with a input box for each( like query page created by wizard). User could define the values in those input boxes. Then the code constructs the WHERE clause based on values entered by user ( and columns name came from the view definition) . at the end when user click on a button( named Find), the page sets the WHERE clause and executes the query and sets the view object based on user defined WHERE clause at runtime ( similar to query page created by wizard).
    Problem:
    Example1 : Pretend client1 clicks the Find button and the page is executing the executeQuery() method. If at this time client2 calls this page, the page loads fast but the columns shows after a delay. this delay is depend on how fast the executeQuery() is. ( this is my understanding, not sure).
    Example2 : Pretend the query takes 2 seconds to be executed when only one client fires that using this page. But takes 10 seconds if two clients at the same time click on the Find button on that page at the same time(after they entered the values on input boxes). And that’s maybe more for three clients.
    On the other words when the executeQuery() is executing for one client, the entire application locks( else where fires the executeQuery() ) for the other clients until the first one released. That’s why I guess ( just guess) this is maybe the behavior of the executeQuery(). Hope this guessing is not true. But what else could be. Is any parameter in application module that need to be altered? Or something on web server (9iAS)?
    Please advice me, even if you are agree or disagree with my guess.
    Thanks for your advice.

  • TS1363 my iphone is locked and i need to delete every thing on it, and reinstall

    my iphone is locked and i need to delete every thing on it, and reinstall. how do i do it?

    You can restore the phone.
    Turn the phone off.
    Once the phone is off, hold the home button and don't let go.
    Press the power button while still holding the home button.
    You should see 'Connect to Itunes' on the screen.
    Connect to iTunes to Restore the phone

Maybe you are looking for

  • My Apple TV 2 is working great but-

    I really want to add some radio stations to it. Apparently, the list of stations that comes up is on an Apple server and is static. But I question this because on my list of stations is an obscure radio station that I had found on my own and that I h

  • 5 IDOC with status 29 Error in ALE service

    hi there, im looking at this similar problem with less information on me the only info i got is this can anyone help me out pls IDOC Status Outbox: IDOC failure between 13/07/2008 to 14/07/2009 1 IDOC with status 02 Error passing data to port 5 IDOC

  • Using two 30-inch displays?

    Can a Mac Pro support two 30-inch Apple Cinema Displays? Thanks.

  • Dynamically stacked plots of chart

    In LV 2009 it is still not possible to set the number of stacked plots of a chart programmatically. Is there any useable workaround? Before I start measurement I know how many channels I will acquire – between 1-16. Before the measurement starts I wa

  • [SOLVED]JDownloader: Open File / Open Download Directory not clickable

    I bought a new drive, JD downloads without problems in a folder in this drive, but I can not click on Open File and Open Download Directory. I use Thunar. On my previous installation I had the same problem and solved it by moving the download folder