php - उप कार्य के लिए लेनदेन काम नहीं कर रहा है




laravel laravel-5 (4)

आप addActionees () विधि में अपवाद को नहीं पकड़ना चाहिए। बस इसे फेंक दो और बाहरी प्रयास-पकड़ ब्लॉक इसे संभाल लेंगे:

मुख्य फ़ंक्शन कोड:

try {
  DB::beginTransaction();
  $data = array(
    'id' => Input::get('id'),
    'task_title' => Input::get('task_title'),
  );
  DB::table('task')->insert($data);
  $id = DB::getPdo()->lastInsertId();

  // Add Actionees
  $this->addActionees(Input::get('actionees'), $id);
  DB::commit();
  return Response::json(true);
} catch (Exception $ex) {
  DB::rollback();
  return Response::json($ex);
}

उप फ़ंक्शन कोड:

private function addActionees($actionees, $id, $status) {
        DB::table('task_assignee_user')->where('task_id', $id)->delete(); 
        foreach ($actionees as $act) {
            $actAdd = array(
                'task_id' => $id,
                'user_id' => $act->user_id,
            );
            DB::table('task_assignee')->insert($actAdd);
        }
}

मैंने DB::beginTransaction() का प्रयोग Laravel में किया है, लेकिन यह केवल डेटाबेस कार्यों के लिए काम करता है जो केवल मुख्य फ़ंक्शन के लिए मुख्य फ़ंक्शन में किया जाता है।

मुख्य फ़ंक्शन कोड:

try {
    DB::beginTransaction();
    $data = array(
        'id' => Input::get('id'),
        'task_title' => Input::get('task_title'),
    );
    DB::table('task')->insert($data);
    $id = DB::getPdo()->lastInsertId();

    // Add Actionees
    if (!$this->addActionees(Input::get('actionees'), $id)) {
        DB::rollback();
        return Response::json(false);
    }
    DB::commit();
    return Response::json(true);
} catch (Exception $ex) {
    DB::rollback();
    return Response::json($ex);
}

उप फ़ंक्शन कोड:

private function addActionees($actionees, $id, $status) {
    try {
        DB::table('task_assignee_user')->where('task_id', $id)->delete(); 
        foreach ($actionees as $act) {
            $actAdd = array(
                'task_id' => $id,
                'user_id' => $act->user_id,
            );
            DB::table('task_assignee')->insert($actAdd);
        }
        return True;
    } catch (Exception $ex) {
        return FALSE;
    }
}

इसलिए उपरोक्त उदाहरण में, कार्य addActionees() तहत किए गए परिवर्तन वापस नहीं addActionees() , फ़ंक्शन addActionees() आईडी के विरुद्ध सभी रिकॉर्ड नए रिकॉर्ड डालने से पहले हटा दिए जाएंगे। यदि कोई अपवाद मिला है तो मैं इन परिवर्तनों को वापस करना चाहता हूं।


मुख्य कार्य में: beginTransaction बोफोोर try{

DB::beginTransaction();
try {
$data = array(
...

इस तरह प्रवाह के माध्यम से लेनदेन का उपयोग करने की कोशिश करें:

DB::beginTransaction();
try {
    $data = array(
        'id' => Input::get('id'),
        'task_title' => Input::get('task_title'),
    );
    DB::table('task')->insert($data);
    $id = DB::getPdo()->lastInsertId();

    // Add Actionees
    $this->addActionees(Input::get('actionees'), $id);
} catch (Exception $ex) {
    DB::rollBack();
    return Response::json($ex);
}

DB::commit();
return Response::json(true);

private function addActionees($actionees, $id, $status) {
    DB::table('task_assignee_user')->where('task_id', $id)->delete(); 
    foreach ($actionees as $act) {
        $actAdd = array(
            'task_id' => $id,
            'user_id' => $act->user_id,
        );
        DB::table('task_assignee')->insert($actAdd);
    }
}
  1. लेनदेन शुरू करें
  2. सीआरयूडी संचालन निष्पादित करें।
  3. अपवाद पकड़ो और लेन-देन रोलबैक करें।
  4. यदि ऑपरेशन सुचारू रूप से निष्पादित किया जाता है, तो लेन-देन करें।

संपादित करें:

addActionees हमेशा सही होता है क्योंकि delete() विधि की वजह से विफल अपवाद नहीं फेंका जाता है इसलिए $this->addActionees(Input::get('actionees'), $id) हमेशा सही वापस आते हैं चलो एक अपवाद मैन्युअल रूप से फेंक देते हैं:

private function addActionees($actionees, $id, $status) {
    $deleteResult = DB::table('task_assignee_user')->where('task_id', $id)->delete(); 
    foreach ($actionees as $act) {
        $actAdd = array(
            'task_id' => $id,
            'user_id' => $act->user_id,
        );
        DB::table('task_assignee')->insert($actAdd);
    }

    if ($deleteResult  == 0) {
        throw new Exception('Delete failed');
    }
}

यदि आप एक समापन के अंदर संपूर्ण लेनदेन लपेटते हैं - यह आपके लिए सब कुछ संभाल लेगा :

public mainFunction()
{
    try {
        DB::transaction(function() {
            $id = DB::table('task')->insertGetId(['id' => Input::get('id'),
                                                  'task_title' => Input::get('task_title')]);

            DB::table('task_assignee_user')->where('task_id', $id)->delete(); 

            foreach(Input::get('actionees') as $act) {
                DB::table('task_assignee')->insert(['task_id' => $id,
                                             'user_id' => $act->user_id]);
            }
        });
    } catch (\Exception $e) {
         return Response::json($e);
    }

    return Response::json(true);
}

ps मैं भी अपने कोड को फिर से लागू किया क्योंकि यह मुझे पागल कर रहा था यह काम करना चाहिए, लेकिन मैंने इसे परीक्षण किया - लेकिन आप सामान्य विचार प्राप्त करते हैं।





transactions