2017-08-03 12 views
1

私はトランザクションでcfscriptを使用していますが、ロールバックを呼び出してもデータベースにレコードが保持されます。私はそこで検証する必要があるので、キャッチではなくtryの内部でロールバックを呼び出しています。ここでロールバックが機能しないcoldfusionトランザクション

は私のコードです:

transaction action="begin"{ 
try{ 
    rollbackAction = false; 
    // Insert into CustomerBilling 
    insertCustomerBilling = new query(); 
    insertCustomerBilling.setDatasource("rent"); 
    insertCustomerBilling.setName("insertCustomerBilling"); 
    insertCustomerBilling.addParam(name="CustomerID", value="#CompanyID#", cfsqltype="cf_sql_integer"); 
    insertCustomerBilling.addParam(name="Cost", value="#Cost#", cfsqltype="cf_sql_decimal"); 
    insertCustomerBilling.addParam(name="BillDate", value="#DateFormat(Now(), 'yyyy/mm/dd')#", cfsqltype="cf_sql_datetime"); 
    insertCustomerBilling.addParam(name="PaidDate", value="#DateFormat(Now(), 'yyyy/mm/dd')#", cfsqltype="cf_sql_datetime"); 
    result = insertCustomerBilling.execute(sql="INSERT INTO CustomerBilling " & 
         " (CustomerID, Cost, BillDate, Paid, PaidDate, PropertyID, BillTypeID) " & 
         " VALUES(:CustomerID, :Cost, :BillDate, 0, :PaidDate, 0, 1)"); 

    GetCCExemption = new query(); 
    GetCCExemption.setDatasource("rent"); 
    GetCCExemption.setName("GetCCExemption"); 
    GetCCExemption.addParam(name="CompanyID", value="#CompanyID#", cfsqltype="cf_sql_integer"); 
    result = GetCCExemption.execute(sql="Select * From Billing_CCExemptions Where CompanyID = :CompanyID"); 
    rs = result.getResult(); 
    if(rs.recordCount <= 0){ 
     // Check if we inserted customer into Stripe_Customer 
     GetStripeCustomer = new query(); 
     GetStripeCustomer.setDatasource("rent"); 
     GetStripeCustomer.setName("GetStripeCustomer"); 
     GetStripeCustomer.addParam(name="CompanyID", value="#CompanyID#", cfsqltype="cf_sql_integer"); 
     resultSC = GetStripeCustomer.execute(sql="Select * From Stripe_Customer Where CompanyID = :CompanyID"); 
     rsSC = resultSC.getResult(); 
     if(rsSC.recordCount > 0){ 
      // Charge 
      charge = oStripe.chargeCustomer(); 
     } else{ 
      // Notify us we haven't inserted into Stripe_Customer 
      mailerService = new mail(); 
      mailerService.setTo('[email protected]'); 
      mailerService.setFrom("[email protected]"); 
      mailerService.setSubject("Error"); 
      mailerService.setType("html"); 
      mailBody = "ERROR"; 
      mailerService.send(body=mailBody); 
      transaction action="rollback"; 

      rollbackAction = true; 
     } 
    } 
    if(!rollbackAction){ 
     transaction action="commit"; 
    } 
} catch(any e){ 
    transaction action="rollback"; 
} 

}

ロールバックが機能しない理由、誰もが知っていますか?

+0

try/catchは、コードが実際に実行されるかどうかであり、目的の結果が得られるかどうかではありません。 –

+0

どういう意味ですか? – user6824563

+0

これは、 '私はキャッチではなく、試行の中でロールバックを呼び出しています'このキャッチ(任意の電子){ トランザクションアクション= "ロールバック"と矛盾します。 '。 –

答えて

2

変更

おかげで、この:

if(!rollbackAction){ 
     transaction action="commit"; 
    } 
} catch(any e){ 
    transaction action="rollback"; 

tryブロックは、ランタイムエラーが発生した場合、この

if(!rollbackAction){ 
    transaction action="commit"; 
} 
else 
    transaction action="rollback"; 

あなたのcatchブロックのみを実行します。ランタイムエラーとは、「実行しなかった」ことを意味します。彼らは望ましくない結果とは何の関係もありません。

関連する問題