Transaction not working for multiple update queries along with a insert query

     public function pay_invoice_due($customer_id, $amount, $payment_medium)
{
    $medium_config = Configure::read('payment_mediums');
    if (array_key_exists($payment_medium, $medium_config)) {
        $medium = $payment_medium;
    } else {
        $res = "Medium not valid";
        echo $res;
        die;
    }
    $invoice_table = TableRegistry::get('invoices');
    $invoices = TableRegistry::get('invoices')->
    find('all', [
        'fields' => ['id', 'customer_id', 'net_total', 'due', 'invoice_date', 'customer_type', 'customer_unit_global_id'],
        'contain' => ['Customers'],
        'conditions' => ['customer_id' => $customer_id, 'Invoices.status' => 1]])
        ->order(['invoice_date' => 'ASC'])->hydrate(false)->toArray();

    if (empty($invoices)) {
        echo "Invoice not found for this customer";
        die;
    }

    $time = time();
    $user = $this->Auth->user();
    $credit_note_amount = $amount;
    $connection = ConnectionManager::get('default');
    $payment_table = TableRegistry::get('payments');
    $payment_entity = $payment_table->newEntity();
    $payment_data['customer_id'] = $customer_id;
    $payment_data['customer_type'] = $invoices[0]['customer_type'];
    $payment_data['parent_global_id'] = $invoices[0]['customer_unit_global_id'];
    $payment_data['medium'] = $medium;
    $payment_data['amount'] = $amount;
    $payment_data['collection_date'] = $time;
    $payment_data['created_date'] = $time;
    $payment_data['created_by'] = $user['id'];
    $payment_data['is_adjustment'] = 1;
    $payment_entity = $payment_table->patchEntity($payment_entity, $payment_data);

     $connection->transactional(function ($connection)
     use ($time, $user, $credit_note_amount, $invoice_table, $customer_id, $medium, $amount, $invoices, $payment_data, $payment_entity, $payment_table) {
        foreach ($invoices as $invoice):
            if ($credit_note_amount != 0) {
                if ($invoice['due'] <= $credit_note_amount) {
                    $paid_due = $credit_note_amount - $invoice['due'];
                    $credit_note_amount = $paid_due;
                    $query = $invoice_table->query();
                    $query->update()
                        ->set(['due' => 0, 'updated_date' => $time, 'updated_by' => $user['id']])
                        ->where(['customer_id' => $customer_id, 'id' => $invoice['id']])
                        ->execute();
                    //$connection->execute('UPDATE invoices SET due = ?, updated_date =? ,updated_by = ? WHERE customer_id = ? AND id=?', [0, $time, $user['id'], $customer_id, $invoice['id']]);

                } else {
                    $paid_due = $invoice['due'] - $credit_note_amount;
                    $credit_note_amount = 0;
                    $query = $invoice_table->query();
                    $query->update()
                        ->set(['due' => $paid_due, 'updated_date' => $time, 'updated_by' => $user['id']])
                        ->where(['customer_id' => $customer_id, 'id' => $invoice['id']])
                        ->execute();

                    // $connection->execute('UPDATE invoices SET due = ?, updated_date =?, updated_by = ? WHERE customer_id = ? AND  id=?', [$paid_due, $time, $user['id'], $customer_id, $invoice['id']]);

                }
            }
        endforeach;

        if ($payment_table->save($payment_entity, $payment_data)) {
            $res = "Payment Created Successfully Created";
            echo $res;
        } else {
            pr($payment_entity->errors());
            echo "Payment Was Unsuccessful";
            die;
        }
     });
}

If any update query failed to execute then I don’t want to execute the save at the end of this method.
But Here transaction is not maintained and it’s not rolling back if any of update queries failed !