مشغل Azure SQL للوظائف

إشعار

في وظائف خطة الاستهلاك، لا يتم دعم التحجيم التلقائي لمشغل SQL. إذا أوقفت عملية التحجيم التلقائي الوظيفة، فستتوقف جميع معالجة الأحداث وستحتاج إلى إعادة تشغيلها يدويا.

استخدم خططا متميزة أو مخصصة لتوسيع نطاق المزايا باستخدام مشغل SQL.

يستخدم مشغل Azure SQL وظيفة تعقب تغيير SQL لمراقبة جدول SQL للتغييرات وتشغيل دالة عند إنشاء صف أو تحديثه أو حذفه. للحصول على تفاصيل التكوين لتعقب التغييرات للاستخدام مع مشغل Azure SQL، راجع إعداد تعقب التغييرات. للحصول على معلومات حول تفاصيل الإعداد لملحق Azure SQL لوظائف Azure، راجع نظرة عامة على ربط SQL.

يتم تنفيذ قرارات التحجيم لمشغل Azure SQL لخطط الاستهلاك وPremium عبر التحجيم المستند إلى الهدف. لمزيد من المعلومات، راجع التحجيم المستند إلى الهدف.

نظرة عامة على الوظائف

يستخدم ربط مشغل Azure SQL حلقة استقصاء للتحقق من وجود تغييرات، ما يؤدي إلى تشغيل وظيفة المستخدم عند الكشف عن التغييرات. على مستوى عال، تبدو الحلقة كما يلي:

while (true) {
    1. Get list of changes on table - up to a maximum number controlled by the Sql_Trigger_MaxBatchSize setting
    2. Trigger function with list of changes
    3. Wait for delay controlled by Sql_Trigger_PollingIntervalMs setting
}

تتم معالجة التغييرات بالترتيب الذي تم به إجراء تغييراتها، مع معالجة أقدم التغييرات أولا. بعض الملاحظات حول معالجة التغيير:

  1. إذا تم إجراء تغييرات على صفوف متعددة في وقت واحد، فإن الترتيب الدقيق لإرسالها إلى الدالة يستند إلى الترتيب الذي تم إرجاعه بواسطة الدالة CHANGETABLE
  2. يتم "تجميع التغييرات" معا لصف. إذا تم إجراء تغييرات متعددة على صف بين كل تكرار للحلقة، فهناك إدخال تغيير واحد فقط لهذا الصف الذي سيظهر الفرق بين الحالة الأخيرة التي تمت معالجتها والحالة الحالية
  3. إذا تم إجراء تغييرات على مجموعة من الصفوف، ثم تم إجراء مجموعة أخرى من التغييرات على نصف تلك الصفوف نفسها، تتم معالجة نصف الصفوف التي لم يتم تغييرها مرة ثانية أولا. منطق المعالجة هذا يرجع إلى الملاحظة أعلاه مع التغييرات التي يتم تجميعها في دفعات - سيشاهد المشغل فقط التغيير "الأخير" الذي تم إجراؤه واستخدامه للترتيب الذي يعالجه فيها

لمزيد من المعلومات حول تعقب التغييرات وكيفية استخدامها من قبل تطبيقات مثل مشغلات Azure SQL، راجع العمل مع تعقب التغييرات .

استخدام المثال

تتوفر المزيد من العينات لمشغل Azure SQL في مستودع GitHub.

يشير المثال إلى ToDoItem فئة وجدول قاعدة بيانات مطابق:

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

يتم تمكين تعقب التغييرات على قاعدة البيانات وعلى الجدول:

ALTER DATABASE [SampleDatabase]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);

ALTER TABLE [dbo].[ToDo]
ENABLE CHANGE_TRACKING;

يرتبط مشغل SQL ب IReadOnlyList<SqlChange<T>>، قائمة الكائنات لكل منها SqlChange خاصيتين:

  • العنصر: العنصر الذي تم تغييره. يجب أن يتبع نوع العنصر مخطط الجدول كما هو ملاحظ في ToDoItem الفئة.
  • العملية: قيمة من SqlChangeOperation قائمة التعداد. والقيم المحتملة هي Insert و Update وDelete.

يوضح المثال التالي دالة C# التي يتم استدعاؤها عند وجود تغييرات على ToDo الجدول:

using System;
using System.Collections.Generic;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Sql;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;


namespace AzureSQL.ToDo
{
    public static class ToDoTrigger
    {
        [Function("ToDoTrigger")]
        public static void Run(
            [SqlTrigger("[dbo].[ToDo]", "SqlConnectionString")]
            IReadOnlyList<SqlChange<ToDoItem>> changes,
            FunctionContext context)
        {
            var logger = context.GetLogger("ToDoTrigger");
            foreach (SqlChange<ToDoItem> change in changes)
            {
                ToDoItem toDoItem = change.Item;
                logger.LogInformation($"Change operation: {change.Operation}");
                logger.LogInformation($"Id: {toDoItem.Id}, Title: {toDoItem.title}, Url: {toDoItem.url}, Completed: {toDoItem.completed}");
            }
        }
    }
}

استخدام المثال

تتوفر المزيد من العينات لمشغل Azure SQL في مستودع GitHub.

يشير المثال إلى ToDoItem فئة وفئة SqlChangeToDoItemSqlChangeOperation تعداد وجدول قاعدة بيانات مطابق:

في ملف ToDoItem.javaمنفصل:

package com.function;
import java.util.UUID;

public class ToDoItem {
    public UUID Id;
    public int order;
    public String title;
    public String url;
    public boolean completed;

    public ToDoItem() {
    }

    public ToDoItem(UUID Id, int order, String title, String url, boolean completed) {
        this.Id = Id;
        this.order = order;
        this.title = title;
        this.url = url;
        this.completed = completed;
    }
}

في ملف SqlChangeToDoItem.javaمنفصل:

package com.function;

public class SqlChangeToDoItem {
    public ToDoItem item;
    public SqlChangeOperation operation;

    public SqlChangeToDoItem() {
    }

    public SqlChangeToDoItem(ToDoItem Item, SqlChangeOperation Operation) {
        this.Item = Item;
        this.Operation = Operation;
    }
}

في ملف SqlChangeOperation.javaمنفصل:

package com.function;

import com.google.gson.annotations.SerializedName;

public enum SqlChangeOperation {
    @SerializedName("0")
    Insert,
    @SerializedName("1")
    Update,
    @SerializedName("2")
    Delete;
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

يتم تمكين تعقب التغييرات على قاعدة البيانات وعلى الجدول:

ALTER DATABASE [SampleDatabase]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);

ALTER TABLE [dbo].[ToDo]
ENABLE CHANGE_TRACKING;

يرتبط مشغل SQL ب SqlChangeToDoItem[]، صفيف من الكائنات لكل منها SqlChangeToDoItem خاصيتين:

  • العنصر: العنصر الذي تم تغييره. يجب أن يتبع نوع العنصر مخطط الجدول كما هو ملاحظ في ToDoItem الفئة.
  • العملية: قيمة من SqlChangeOperation قائمة التعداد. والقيم المحتملة هي Insert و Update وDelete.

يوضح المثال التالي دالة Java التي يتم استدعاؤها عند وجود تغييرات في ToDo الجدول:

package com.function;

import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.sql.annotation.SQLTrigger;
import com.function.Common.SqlChangeToDoItem;
import com.google.gson.Gson;

import java.util.logging.Level;

public class ProductsTrigger {
    @FunctionName("ToDoTrigger")
    public void run(
            @SQLTrigger(
                name = "todoItems",
                tableName = "[dbo].[ToDo]",
                connectionStringSetting = "SqlConnectionString")
                SqlChangeToDoItem[] todoItems,
            ExecutionContext context) {

        context.getLogger().log(Level.INFO, "SQL Changes: " + new Gson().toJson(changes));
    }
}

استخدام المثال

تتوفر المزيد من العينات لمشغل Azure SQL في مستودع GitHub.

يشير المثال إلى ToDoItem جدول قاعدة بيانات:

CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

يتم تمكين تعقب التغييرات على قاعدة البيانات وعلى الجدول:

ALTER DATABASE [SampleDatabase]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);

ALTER TABLE [dbo].[ToDo]
ENABLE CHANGE_TRACKING;

يرتبط مشغل SQL ب todoChanges، قائمة الكائنات لكل منها خاصيتين:

  • العنصر: العنصر الذي تم تغييره. ستتبع بنية العنصر مخطط الجدول.
  • العملية: القيم المحتملة هي Insertو Updateو.Delete

يوضح المثال التالي دالة PowerShell التي يتم استدعاؤها عند وجود تغييرات في ToDo الجدول.

فيما يلي هو ربط البيانات في ملف function.json:

{
    "name": "todoChanges",
    "type": "sqlTrigger",
    "direction": "in",
    "tableName": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
}

قسم التكوين يشرح هذه الخصائص.

فيما يلي نموذج التعليمات البرمجية PowerShell للدالة في run.ps1 الملف:

using namespace System.Net

param($todoChanges)
# The output is used to inspect the trigger binding parameter in test methods.
# Use -Compress to remove new lines and spaces for testing purposes.
$changesJson = $todoChanges | ConvertTo-Json -Compress
Write-Host "SQL Changes: $changesJson"

استخدام المثال

تتوفر المزيد من العينات لمشغل Azure SQL في مستودع GitHub.

يشير المثال إلى ToDoItem جدول قاعدة بيانات:

CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

يتم تمكين تعقب التغييرات على قاعدة البيانات وعلى الجدول:

ALTER DATABASE [SampleDatabase]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);

ALTER TABLE [dbo].[ToDo]
ENABLE CHANGE_TRACKING;

يربط todoChangesمشغل SQL ، صفيف من الكائنات لكل منها خاصيتين:

  • العنصر: العنصر الذي تم تغييره. ستتبع بنية العنصر مخطط الجدول.
  • العملية: القيم المحتملة هي Insertو Updateو.Delete

يوضح المثال التالي دالة JavaScript التي يتم استدعاؤها عند وجود تغييرات في ToDo الجدول.

فيما يلي هو ربط البيانات في ملف function.json:

{
    "name": "todoChanges",
    "type": "sqlTrigger",
    "direction": "in",
    "tableName": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
}

قسم التكوين يشرح هذه الخصائص.

فيما يلي نموذج التعليمات البرمجية JavaScript للدالة في index.js الملف:

module.exports = async function (context, todoChanges) {
    context.log(`SQL Changes: ${JSON.stringify(todoChanges)}`)
}

استخدام المثال

تتوفر المزيد من العينات لمشغل Azure SQL في مستودع GitHub.

يشير المثال إلى ToDoItem جدول قاعدة بيانات:

CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

يتم تمكين تعقب التغييرات على قاعدة البيانات وعلى الجدول:

ALTER DATABASE [SampleDatabase]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);

ALTER TABLE [dbo].[ToDo]
ENABLE CHANGE_TRACKING;

يرتبط مشغل SQL بمتغير todoChanges، قائمة الكائنات لكل منها خاصيتين:

  • العنصر: العنصر الذي تم تغييره. ستتبع بنية العنصر مخطط الجدول.
  • العملية: القيم المحتملة هي Insertو Updateو.Delete

يوضح المثال التالي دالة Python التي يتم استدعاؤها عند وجود تغييرات على ToDo الجدول.

فيما يلي هو ربط البيانات في ملف function.json:

{
    "name": "todoChanges",
    "type": "sqlTrigger",
    "direction": "in",
    "tableName": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
}

قسم التكوين يشرح هذه الخصائص.

فيما يلي نموذج التعليمات البرمجية Python للدالة في __init__.py الملف:

import json
import logging

def main(changes):
    logging.info("SQL Changes: %s", json.loads(changes))

السمات

تستخدم مكتبة C# السمة SqlTrigger للإعلان عن مشغل SQL على الدالة التي تحتوي على الخصائص التالية:

خاصية السمة ‏‏الوصف
TableName مطلوب. اسم الجدول الذي يراقبه المشغل.
ConnectionStringSetting مطلوب. اسم إعداد تطبيق يحتوي على سلسلة الاتصال لقاعدة البيانات التي تحتوي على الجدول الذي تمت مراقبته للتغييرات. يتوافق اسم إعداد سلسلة الاتصال مع إعداد التطبيق (في local.settings.json للتطوير المحلي) الذي يحتوي على سلسلة الاتصال بـ Azure SQL أو مثيل SQL Server.
LeasesTableName اختياري. اسم الجدول المستخدم لتخزين عقود الإيجار. إذا لم يتم تحديده، فسيكون اسم جدول الإيجارات Leases_{FunctionId}_{TableId}. يمكن العثور على مزيد من المعلومات حول كيفية إنشاء هذا هنا.

تعليقات توضيحية

في مكتبة وقت تشغيل وظائف Java، استخدم @SQLTrigger التعليق التوضيحي (com.microsoft.azure.functions.sql.annotation.SQLTrigger) على المعلمات التي تأتي قيمتها من Azure SQL. يدعم هذا التعليق التوضيحي العناصر التالية:

العنصر ‏‏الوصف‬
الاسم مطلوب. اسم المعلمة التي يرتبط بها المشغل.
اسم الجدول مطلوب. اسم الجدول الذي يراقبه المشغل.
connectionStringSetting مطلوب. اسم إعداد تطبيق يحتوي على سلسلة الاتصال لقاعدة البيانات التي تحتوي على الجدول الذي تمت مراقبته للتغييرات. يتوافق اسم إعداد سلسلة الاتصال مع إعداد التطبيق (في local.settings.json للتطوير المحلي) الذي يحتوي على سلسلة الاتصال بـ Azure SQL أو مثيل SQL Server.
LeasesTableName اختياري. اسم الجدول المستخدم لتخزين عقود الإيجار. إذا لم يتم تحديده، فسيكون اسم جدول الإيجارات Leases_{FunctionId}_{TableId}. يمكن العثور على مزيد من المعلومات حول كيفية إنشاء هذا هنا.

التكوين

يشرح الجدول الآتي خصائص تكوين ربط البيانات التي عليك تعيينها في ملف function.json.

خاصية function.json ‏‏الوصف‬
الاسم مطلوب. اسم المعلمة التي يرتبط بها المشغل.
النوع مطلوب. يجب تعيينه إلى sqlTrigger.
الاتجاه مطلوب. يجب تعيينه إلى in.
اسم الجدول مطلوب. اسم الجدول الذي يراقبه المشغل.
connectionStringSetting مطلوب. اسم إعداد تطبيق يحتوي على سلسلة الاتصال لقاعدة البيانات التي تحتوي على الجدول الذي تمت مراقبته للتغييرات. يتوافق اسم إعداد سلسلة الاتصال مع إعداد التطبيق (في local.settings.json للتطوير المحلي) الذي يحتوي على سلسلة الاتصال بـ Azure SQL أو مثيل SQL Server.
LeasesTableName اختياري. اسم الجدول المستخدم لتخزين عقود الإيجار. إذا لم يتم تحديده، فسيكون اسم جدول الإيجارات Leases_{FunctionId}_{TableId}. يمكن العثور على مزيد من المعلومات حول كيفية إنشاء هذا هنا.

التكوين الاختياري

يمكن تكوين الإعدادات الاختيارية التالية لمشغل SQL:

يصف هذا القسم إعدادات التكوين المتاحة لهذا الربط في الإصدارات 2.x وأعلى. تنطبق الإعدادات في ملف host.json على جميع الوظائف في مثيل تطبيق الوظائف. يحتوي مثال ملف host.json أدناه على إعدادات الإصدار 2.x + فقط لهذا الربط. للحصول على مزيدٍ من المعلومات عن إعدادات تكوين التطبيق الوظيفي في الإصدارات 2.x والإصدارات الأحدث، راجع مرجع host.json لوظائف Azure.

الإعدادات ‏‏الوصف
Sql_Trigger_BatchSize الحد الأقصى لعدد التغييرات التي تمت معالجتها مع كل تكرار لحلقة المشغل قبل إرسالها إلى الدالة المشغلة. القيمة الافتراضية هي 100.
Sql_Trigger_PollingIntervalMs التأخير بالمللي ثانية بين معالجة كل دفعة من التغييرات. القيمة الافتراضية هي 1000 (ثانية 1).
Sql_Trigger_MaxChangesPerWorker الحد الأعلى لعدد التغييرات المعلقة في جدول المستخدم المسموح بها لكل عامل تطبيق. إذا تجاوز عدد التغييرات هذا الحد، فقد يؤدي ذلك إلى توسيع النطاق. ينطبق الإعداد فقط على Azure Function Apps مع تمكين التحجيم المستند إلى وقت التشغيل. القيمة الافتراضية هي 1000.

إعداد تعقب التغييرات (مطلوب)

يتطلب إعداد تعقب التغييرات للاستخدام مع مشغل Azure SQL خطوتين. يمكن إكمال هذه الخطوات من أي أداة SQL تدعم تشغيل الاستعلامات، بما في ذلك Visual Studio Code أو Azure Data Studio أو SQL Server Management Studio.

  1. تمكين تعقب التغيير على قاعدة بيانات SQL، واستبدال your database name باسم قاعدة البيانات حيث يوجد الجدول الذي سيتم مراقبته:

    ALTER DATABASE [your database name]
    SET CHANGE_TRACKING = ON
    (CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);
    

    CHANGE_RETENTION يحدد الخيار الفترة الزمنية التي يتم فيها الاحتفاظ بمعلومات تعقب التغييرات (محفوظات التغيير). قد يؤثر الاحتفاظ بمحفوظات التغيير بواسطة قاعدة بيانات SQL على وظيفة المشغل. على سبيل المثال، إذا تم إيقاف تشغيل Azure Function لعدة أيام ثم استئنافها، فستحتوي قاعدة البيانات على التغييرات التي حدثت في اليومين الماضيين في مثال الإعداد أعلاه.

    AUTO_CLEANUP يتم استخدام الخيار لتمكين مهمة التنظيف التي تزيل معلومات تعقب التغييرات القديمة أو تعطيلها. إذا كانت هناك مشكلة مؤقتة تمنع المشغل من التشغيل، يمكن أن يكون إيقاف تشغيل التنظيف التلقائي مفيدا لإيقاف إزالة المعلومات الأقدم من فترة الاستبقاء مؤقتا حتى يتم حل المشكلة.

    تتوفر المزيد من المعلومات حول خيارات تعقب التغييرات في وثائق SQL.

  2. تمكين تعقب التغييرات على الجدول، واستبدال your table name باسم الجدول المطلوب مراقبته (تغيير المخطط إذا كان ذلك مناسبا):

    ALTER TABLE [dbo].[your table name]
    ENABLE CHANGE_TRACKING;
    

    يحتاج المشغل إلى الوصول للقراءة على الجدول الذي تتم مراقبته للتغييرات وإلى جداول نظام تعقب التغييرات. يحتوي كل مشغل دالة على جدول تعقب تغيير مقترن وجدول تأجير في مخطط az_func. يتم إنشاء هذه الجداول بواسطة المشغل إذا لم تكن موجودة بعد. يتوفر مزيد من المعلومات حول بنيات البيانات هذه في وثائق مكتبة ربط Azure SQL.

تمكين التحجيم المستند إلى وقت التشغيل

اختياريا، يمكن توسيع نطاق الدالات تلقائيا استنادا إلى عدد التغييرات المعلقة التي سيتم معالجتها في جدول المستخدم. للسماح لوظائفك بالتحجيم بشكل صحيح على خطة Premium عند استخدام مشغلات SQL، تحتاج إلى تمكين مراقبة مقياس وقت التشغيل.

في مدخل Microsoft Azure، في تطبيق وظيفتك، اختر Configuration وفي علامة التبويب Function runtime settings، قم بتشغيل Runtime scale monitoring إلى On.

لقطة شاشة للوحة مدخل Microsoft Azure لتمكين تحجيم وقت التشغيل.

إعادة محاولة الدعم

تتوفر مزيد من المعلومات حول جداول إعادة محاولة تشغيل مشغل SQL وجداولالإيجار في مستودع GitHub.

إعادة محاولة بدء التشغيل

إذا حدث استثناء أثناء بدء التشغيل، فسيحاول وقت تشغيل المضيف تلقائيا إعادة تشغيل مستمع المشغل باستخدام استراتيجية التراجع الأسي. تستمر عمليات إعادة المحاولة هذه حتى يتم بدء تشغيل وحدة الاستماع بنجاح أو إلغاء بدء التشغيل.

إعادة محاولة الاتصال المقطوعة

إذا بدأت الدالة بنجاح ولكن بعد ذلك يتسبب خطأ في انقطاع الاتصال (مثل الخادم غير متصل) ثم تستمر الدالة في محاولة إعادة فتح الاتصال حتى يتم إيقاف الدالة أو نجاح الاتصال. إذا تمت إعادة تأسيس الاتصال بنجاح، فإنه يلتقط معالجة التغييرات من حيث توقفت.

لاحظ أن عمليات إعادة المحاولة هذه خارج منطق إعادة محاولة الاتصال الخامل المضمن الذي يحتوي عليه SqlClient والذي يمكن تكوينه باستخدام ConnectRetryCount خيارات سلسلة الاتصال وConnectRetryInterval. تتم محاولة إعادة محاولة الاتصال الخامل المضمنة أولا وإذا فشلت هذه المحاولات في إعادة الاتصال، يحاول ربط المشغل إعادة تأسيس الاتصال نفسه.

إعادة محاولة استثناء الدالة

إذا حدث استثناء في وظيفة المستخدم عند معالجة التغييرات، تتم إعادة محاولة دفعة الصفوف التي تتم معالجتها حاليا مرة أخرى في 60 ثانية. تتم معالجة التغييرات الأخرى كالمعتاد خلال هذا الوقت، ولكن يتم تجاهل الصفوف في الدفعة التي تسببت في الاستثناء حتى انقضاء فترة المهلة.

إذا فشل تنفيذ الدالة خمس مرات في صف لصف معين، فسيتم تجاهل هذا الصف تماما لجميع التغييرات المستقبلية. نظرا لأن الصفوف في الدفعة ليست محددة، فقد ينتهي الأمر بالصفوف في دفعة فاشلة في دفعات مختلفة في استدعاءات لاحقة. وهذا يعني أنه لن يتم بالضرورة تجاهل جميع الصفوف في الدفعة الفاشلة. إذا كانت الصفوف الأخرى في الدفعة هي الصفوف التي تسبب الاستثناء، فقد ينتهي الأمر بالصفوف "الجيدة" في دفعة مختلفة لا تفشل في استدعاءات المستقبل.

الخطوات التالية