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

Reply via email to