Andre, Is this DAO a singleton? I notice the queries aren't var scoped. If this is a singleton under load another thread could easily overwrite your trans_insert variable in between issuing the query and logging the generated key.
Jaime On Tue, Dec 8, 2009 at 8:58 PM, Andre Kapp <kap...@gmail.com> wrote: > > Ok - changed the pk id field returned to the following: > <cfset theTransID = trans_insert_res.GENERATED_KEY> > > Still the same issue. > > > Here is the complete cfc module.... sorry for it being a bit long... > > <cfcomponent displayname="TransDAO"> > > <cffunction name="init" access="public" > returntype="moneymaker.core.model.trans.TransDAO" output="false"> > <cfargument name="datasourceSettings" > type="moneymaker.core.model.DatasourceSettings" required="true"/> > <cfset variables.dss = arguments.datasourceSettings /> > <cfset variables.dsn = variables.dss.getDatasourceName() /> > <cfset variables.accountService = > application.serviceFactory.getBean("AccountService")> > <cfreturn this /> > </cffunction> > > <cffunction name="fetch" access="public" returntype="Trans" > displayname="fetch"> > </cffunction> > > <cffunction name="process" access="public" returntype="struct"> > > <cfargument name="acctid" required="Yes" type="numeric" /> > <cfargument name="cardid" required="Yes" type="numeric" /> > <cfargument name="cardnumber" required="Yes" type="numeric" /> > <cfargument name="amount" required="Yes" type="numeric" /> > <cfargument name="type" required="Yes" type="string" /> > <cfargument name="paytype" required="Yes" type="numeric" /> > <cfargument name="description" required="Yes" type="string" /> > <cfargument name="tracenumber" required="no" type="string" > default="" /> > <cfargument name="stLimits" required="Yes" type="struct" /> > > <cfset var stTrans = structNew() /> > > <cftry> > <cflog file="transdao_cfc" text="Process tx for > #cardnumber#" type="information"> > <!--- Get balance ---> > <cfset theCurrentAvailableBalance = > variables.accountService.getAccountBalance("available", arguments.acctid)> > <cfset theCurrentActualBalance = > variables.accountService.getAccountBalance("actual", arguments.acctid)> > <cfset theNewAvailableBalance = > numberformat(theCurrentAvailableBalance, "_.__") + > numberformat(arguments.amount, "_.__")> > <cfset theNewActualBalance = > numberformat(theCurrentActualBalance, "_.__") + > numberformat(arguments.amount, "_.__")> > <cfset theNewActualRunningBalance = > numberformat(theCurrentActualBalance, "_.__") + > numberformat(arguments.amount, "_.__")> > > <!--- If debit, make sure there is enough funds ---> > > <!--- > 2009-09-29 AJK > Changed this to enabled debit to push the account > into negative. > > <cfif arguments.type IS "D99" AND theNewAvailableBalance LT 0> > <cfthrow errorcode="51" detail="Insuffcient Funds" > message="Error 51: Card has insufficient funds"> > </cfif> > ---> > > <!--- Check status of card/account ---> > <cfquery datasource="#variables.dsn#" name="cardcheck"> > SELECT * > FROM card > WHERE card_id = <cfqueryparam cfsqltype="CF_SQL_NUMERIC" > value="#arguments.cardid#"> > </cfquery> > > > <cfif cardcheck.status_id NEQ 1> > <cfswitch expression="#cardcheck.status_id#"> > <!--- Closed account ---> > <cfcase value="3"><cflog text="closed > card:#cardcheck.card_cardnumber# loaded for #arguments.amount# on > #dateformat(now(), 'yyyy-mm-dd')# #timeformat(now(), 'HH:mm:ss')#" > file="closed_card_loads" type="Information"></cfcase> > <!--- Lost Card ---> > <cfcase value="4"><cfif arguments.type NEQ > "D98"><cfthrow errorcode="41" detail="Lost Card" message="Error 41: Card has > been reported lost"></cfif></cfcase> > <!--- Stolen Card ---> > <cfcase value="5"><cfif arguments.type NEQ > "D98"><cfthrow errorcode="43" detail="Stolen Card" message="Error 43: Card > has been reported stolen"></cfif></cfcase> > <!--- Restricted Card ---> > <cfcase value="10"> > <cfthrow errorcode="62" detail="Restricted Card" > message="Error 62: Card is restricted"> > </cfcase> > <!--- New Inactive Card ---> > <cfcase value="11"> > <cftry> > <cfif cardcheck.card_type_id EQ 1 OR > cardcheck.bin_prog_link_id EQ 9> > <cfquery datasource="#variables.dsn#"> > update card > set status_id = 1 > where card_id = <cfqueryparam > cfsqltype="CF_SQL_NUMERIC" value="#arguments.cardid#"> > </cfquery> > <cflog text="#cardcheck.card_cardnumber# > activated on load" file="activate_on_load" type="Information"> > </cfif> > <cfcatch type="Any"> > <cflog > text="#cfcatch.toString()#--#cardcheck.card_cardnumber#" > file="activate_on_load_error" type="Error"> > </cfcatch> > </cftry> > </cfcase> > <!---Invalid Account ---> > <cfdefaultcase><cfthrow errorcode="14" detail="Closed > account" message="Error 14: Card account has been closed"></cfdefaultcase> > </cfswitch> > </cfif> > > <!--- If tracenumber is present, check for duplicate transaction > ---> > > <cfif len(arguments.tracenumber)> > <cfquery name="checkTraceNumber" > datasource="#variables.dsn#"> > SELECT trans_id > FROM trans > WHERE > trans_api_tracenumber = <cfqueryparam > cfsqltype="cf_sql_varchar" value="#arguments.tracenumber#"> AND > card_id = <cfqueryparam cfsqltype="CF_SQL_INTEGER" > value="#arguments.cardid#"> AND > status_id = <cfqueryparam cfsqltype="CF_SQL_INTEGER" > value="6"> > </cfquery> > <cfif checkTraceNumber.recordCount> > <cfthrow errorcode="61" detail="Duplicate Transaction" > message="Error 61: Duplicate Transaction Attempt"> > </cfif> > </cfif> > > <!--- If credit, check load limmits ---> > <cfif arguments.type IS "L99" AND isStruct(stLimits)> > > <cfif stLimits.loads.checkperload AND > numberformat(arguments.amount, "_.__") GT > numberformat(stLimits.loads.per_load_limit, "_.__")> > <cfthrow errorcode="61" detail="Exceeds Transaction > Limit" message="Error 61: Exceeds per load limit"> > </cfif> > > <!--- <cflog > text="#stLimits.loads.checkperload#|#numberformat(arguments.amount, > '_.__')#|#numberformat(stLimits.loads.per_load_limit, '_.__')#" > file="perloadcheck" type="Error"> ---> > > <!--- Check per month limit ---> > <cfif stLimits.loads.checkpermonth> > > <cfset startdttm = createdate(datepart('yyyy',now()), > datepart('m',now()), 1)> > <cfset enddttm = createdate(datepart('yyyy',now()), > datepart('m',now()), daysinmonth(now()))> > <cfquery name="getMonthlySum" > datasource="#variables.dsn#"> > SELECT > > IF(ISNULL(SUM(trans_amount)),0,SUM(trans_amount)) AS monthlysum > FROM > trans > WHERE > acct_id = #arguments.acctid# AND > trans_transaction_type = 'L99' AND > status_id = 6 AND > trans_datetime >= <cfqueryparam > cfsqltype="cf_sql_varchar" value="#DateFormat(startdttm, 'yyyy-mm-dd')# > 00:00:00"> AND > trans_datetime <= <cfqueryparam > cfsqltype="cf_sql_varchar" value="#DateFormat(enddttm, 'yyyy-mm-dd')# > 23:59:59"> > </cfquery> > > <cfset t = numberformat(getMonthlySum.monthlysum + > arguments.amount, "_.__")> > <!--- <cflog > text="#stLimits.loads.checkpermonth#|#startdttm#|#enddttm#|#numberformat(stLimits.loads.per_month_limit, > '_.__')#|#t#" file="permonthcheck" type="Error"> ---> > > <cfif t GT numberformat(stLimits.loads.per_month_limit, > "_.__")> > <cfthrow errorcode="61" detail="Exceeds Transaction > Limit" message="Error 61: Exceeds monthly load limit"> > </cfif> > </cfif> > > </cfif> > > <!--- Process Transaction ---> > <cftransaction isolation="READ_COMMITTED"> > > <!--- Insert trans into gateway ---> > <cfquery datasource="#variables.dsn#" name="trans_insert" > result="trans_insert_res"> > INSERT INTO trans ( > acct_id, > card_id, > trans_pan, > trans_amount, > trans_response_code, > trans_begin_balance, > trans_end_balance, > trans_transaction_type, > trans_message_type, > trans_description, > trans_datetime, > trans_api_tracenumber, > status_id > ) VALUES ( > <cfqueryparam cfsqltype="CF_SQL_INTEGER" > value="#arguments.acctid#">, > <cfqueryparam cfsqltype="CF_SQL_INTEGER" > value="#arguments.cardid#">, > <cfqueryparam cfsqltype="CF_SQL_VARCHAR" > value="#arguments.cardNumber#">, > <cfqueryparam cfsqltype="CF_SQL_FLOAT" > value="#arguments.amount#">, > <cfqueryparam cfsqltype="CF_SQL_VARCHAR" > value="00">, > <cfqueryparam cfsqltype="CF_SQL_FLOAT" > value="#theCurrentActualBalance#">, > <cfqueryparam cfsqltype="CF_SQL_FLOAT" > value="#theNewActualRunningBalance#">, > <cfqueryparam cfsqltype="CF_SQL_VARCHAR" > value="#arguments.type#">, > <cfqueryparam cfsqltype="CF_SQL_INTEGER" > value="#arguments.paytype#">, > <cfqueryparam cfsqltype="CF_SQL_VARCHAR" > value="#arguments.description#">, > NOW(), > <cfqueryparam cfsqltype="cf_sql_varchar" > value="#arguments.tracenumber#">, > <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="6"> > ) > </cfquery> > > <cfset theParentTransID = > trans_insert_res.GENERATED_KEY> > > <cfset theTransID = trans_insert_res.GENERATED_KEY> > > > <cflog file="transdao_cfc" text="Process tx > for #cardnumber# with tx id #theTransID# and theParentTransID is > #theParentTransID#" type="information"> > > <!--- Update acct balance on gateway ---> > <cfquery datasource="#variables.dsn#"> > UPDATE acct_balances > SET > acct_balance = acct_balance + #arguments.amount#, > acct_balance_available = acct_balance_available + > #arguments.amount# > WHERE > acct_id = <cfqueryparam cfsqltype="CF_SQL_INTEGER" > value="#arguments.acctid#"> > </cfquery> > > </cftransaction> > > > <!--------------------------------------------------------------------------- > CHECK FOR NEG to POS > > ----------------------------------------------------------------------------> > <cftry> > <cfif theCurrentActualBalance LT 0 AND > theNewActualBalance GTE 0> > <cfquery datasource="#variables.dsn#"> > UPDATE fees_collection > SET > settled = <cfqueryparam > cfsqltype="CF_SQL_INTEGER" value="1">, > settled_trans_id = <cfqueryparam > cfsqltype="CF_SQL_INTEGER" value="#theTransID#">, > settled_dttm = NOW() > WHERE > acct_id = <cfqueryparam > cfsqltype="CF_SQL_INTEGER" value="#arguments.acctid#"> AND > settled = 0 > </cfquery> > </cfif> > <cfcatch type="any"><cflog file="transdao_cfc" > text="#cfcatch.toString()#"></cfcatch> > </cftry> > > <!--- Set response ---> > <cfset stTrans.responsecode = 00 /> > <cfset stTrans.transid = theTransID /> > <cfset stTrans.success = true /> > <cfset stTrans.message = "" /> > <cfset stTrans.start_actualbalance = theCurrentActualBalance> > <cfset stTrans.start_availablebalance = > theCurrentAvailableBalance> > <cfset stTrans.end_actualbalance = theNewActualBalance> > <cfset stTrans.end_availablebalance = theNewAvailableBalance> > <cflog file="transdao_cfc" text=" Process tx (after > transaction) for #cardnumber# with tx id #stTrans.transid# and > theParentTransID is #theParentTransID#" type="information"> > > > <cfif #theParentTransID# NEQ #theTransID#> > <cflog file="transdao_cfc" text="######### > Different #####################" type="information"> > </cfif> > > <cfcatch type="any"> > > <cflog file="transdao_cfc" text="Error > happend !!!!! #cfcatch.message# #cfcatch.errorcode#" type="error"> > <cfset stTrans.responsecode = cfcatch.errorcode /> > <cfset stTrans.transid = "" /> > <cfset stTrans.success = false /> > <cfset stTrans.message = cfcatch.message /> > <cfset stTrans.start_actualbalance = 0> > <cfset stTrans.start_availablebalance = 0> > <cfset stTrans.end_actualbalance = 0> > <cfset stTrans.end_availablebalance = 0> > <cfwddx action="CFML2WDDX" input="#cfcatch#" > output="errors_wddx"> > <!--- > <cflog text="#errors_wddx#" file="api_load_errors" > type="Error"> > ---> > </cfcatch> > > </cftry> > > <cfreturn stTrans /> > > </cffunction> > > </cfcomponent> > > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| Want to reach the ColdFusion community with something they want? Let them know on the House of Fusion mailing lists Archive: http://www.houseoffusion.com/groups/cf-talk/message.cfm/messageid:328980 Subscription: http://www.houseoffusion.com/groups/cf-talk/subscribe.cfm Unsubscribe: http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=89.70.4