Aracılığıyla paylaş


TPS Bileşenlerini Anlama

Çekirdek İşlem Yöneticisi (KTM) ve Ortak Günlük Dosya Sistemi (CLFS) kullanan işlem işleme sistemi (TPS) aşağıdaki önemli bileşenleri içermelidir:

  • işlem yöneticisi (KTM)

    KTM, her işlemin durumunu izler ve bir sistem kilitlenmesi sonrasında kurtarma işlemlerini koordine eder.

  • Bir veya daha fazla kaynak yöneticisi

    Sağladığınız kaynak yöneticileri her işlemle ilişkili verileri yönetir.

  • Bir veya birden fazla CLFS günlük akışı

    İşlem yöneticisi ve kaynak yöneticileri, bir işlemi işlemek, geri almak veya kurtarmak için kullanabilecekleri bilgileri kaydetmek için CLFS günlük akışlarını kullanır.

  • Bir veya daha fazla işlem istemcisi

    Genellikle, TPS'nizin her işlem istemcisi bir işlem oluşturabilir, işlem bağlamında veriler üzerinde işlemler gerçekleştirebilir ve ardından işlem için bir işleme veya geri alma işlemi başlatabilir.

Bu makalede, bir kaynak yöneticisine sahip basit bir TPS , birden çok kaynak yöneticisi içeren daha karmaşık bir TPS ve diğer bazı TPS senaryoları tanıtılabilir.

Using KTM bölümü, TPS bileşenleri oluşturmak için KTM'yi kullanma hakkında ayrıntılı bilgi sağlar.

Basit TPS

Basit bir TPS, KTM, bir kaynak yöneticisi ve CLFS'yi içerebilir. İşlem istemcileri, kaynak yöneticisinin sağladığı bir arabirim aracılığıyla kaynak yöneticisiyle iletişim kurabilir.

Örneğin, bir veritabanı yönetim sistemi oluşturmak istediğinizi varsayalım. Veritabanı nesnesine tanıtıcı açarak, nesne üzerinde okuma ve yazma işlemleri gerçekleştirerek ve sonra nesne tutamacını kapatarak sisteminizin istemcilerinin veritabanına erişmesini istiyorsunuz.

Şimdi, sistemin diğer kullanıcılarının yalnızca nihai sonucu görmesi için okuma ve yazma işlemleri kümelerinin atomik olarak gerçekleşmesini istediğinizi varsayalım. İstemcilerin veritabanı işlemleri kümelerini bir işleme bağlamasını sağlayan bir TPS tasarlayarak bu hedefe ulaşabilirsiniz.

Sisteminiz, istemcilerden gelen okuma ve yazma isteklerine yanıt olarak veritabanındaki verileri yöneten bir kaynak yöneticisi içermelidir. Bu kaynak yöneticisi, istemcilerin bir işlemi bir dizi okuma ve yazma işlemiyle ilişkilendirmesini sağlayan bir uygulama programlama arabirimini (API) dışarı aktarabilir.

Kaynak yöneticinizi yüklediğinizde, ZwCreateTransactionManager ve ZwCreateResourceManager'ı çağırarak kendisini KTM'ye kaydetmesi gerekir. Ardından kaynak yöneticisi işlemlere katılabilir.

Kaynak yöneticinizin istemcilerin veri nesneleri oluşturmasına, veri nesneleriyle ilişkili verileri okumasına ve yazmasına ve veri nesnelerini kapatmasına olanak tanıyan bir dizi işlevi desteklemesini isteyebilirsiniz. Aşağıdaki sahte kod, bir istemciden örnek bir kod dizisi gösterir.

CreateDataObject (IN TransactionID, OUT DataHandle);
ReadData (IN DataHandle, OUT Data);
WriteData (IN DataHandle, IN Data);
WriteData (IN DataHandle, IN Data);
WriteData (IN DataHandle, IN Data);
CloseDataObject (IN DataHandle);

İstemcinin kaynak yöneticinizin CreateDataObject yordamını çağırabilmesi için önce istemcinin KTM'nin ZwCreateTransaction yordamını çağırarak bir işlem nesnesi oluşturması ve ZwQueryInformationTransactionçağırarak işlem nesnesinin tanımlayıcısını alması gerekir.

İstemci kaynak yöneticinizin CreateDataObject yordamını çağırdığında, istemci işlem nesnesinin tanımlayıcısını kaynak yöneticisine geçirir. Kaynak yöneticisi, işlem nesnesine tanıtıcı almak için ZwOpenTransaction çağırabilir ve ardından işleme katılımını kaydetmek için ZwCreateEnlistment çağırabilir.

Bu noktada, istemci veri nesnesi üzerinde işlem gerçekleştirmeye başlayabilir. İstemci veri nesnesini oluştururken bir işlem tanımlayıcısı sağladığından, kaynak yöneticisi tüm okuma ve yazma işlemlerini işleme atayabilir.

Kaynak yöneticinizin, sonuçları kalıcı hale getirmeden istemcinin belirttiği veri işlemlerinin tüm sonuçlarını kaydetmesi gerekir. Kaynak yöneticisi genellikle işlem sonuçlarını bir işlem günlüğü akışına kaydetmek için CLFS kullanır.

İstemci işlem işlemlerini gerçekleştirmek için kaynak yöneticisini çağırmayı bitirdiğinde, KTM'nin ZwCommitTransaction yordamını çağırır. Bu noktada KTM ,'e kaynak yöneticisinin işlemleri kalıcı hale getirmesi gerektiğini bildirir. Kaynak yöneticisi daha sonra günlük akışındaki işlem sonuçlarını verilerin kalıcı depolama ortamına taşır. Son olarak, kaynak yöneticisi ZwCommitComplete çağırarak KTM'ye işleme işleminin tamamlandığını bildirir.

Kaynak yöneticiniz, istemcinin ReadData veya WriteDataçağrılarından biri için bir hata bildirirse ne olur? İstemci işlemi geri almak için ZwRollbackTransaction çağırabilir. Bu çağrının sonucunda KTM, kaynak yöneticisine verileri özgün durumuna geri yüklemesi gerektiğini bildirir. Ardından istemci aynı işlemler için yeni bir işlem oluşturabilir veya devam etmemeyi seçebilir.

Aşağıdaki sahte kod, bir istemcinin işlem işlemlerinin daha ayrıntılı bir sırasının örneğini gösterir.

    ZwCreateTransaction (&TransactionHandle, ...);
    ZwQueryInformationTransaction (TransactionHandle, ...);
    CreateDataObject (TransactionID, &DataHandle);
    Status = ReadData (DataHandle, &Data1);
    if (Status == Error) goto ErrorRollback;
    Status = WriteData (DataHandle, Data2);
    if (Status == Error) goto ErrorRollback;
    Status = WriteData (DataHandle, Data3);
    if (Status == Error) goto ErrorRollback;
    Status = WriteData (DataHandle, Data4);
    if (Status == Error) goto ErrorRollback;
    ZwCommitTransaction (TransactionHandle, ...);
    goto Leave;
ErrorRollback:
    ZwRollbackTransaction (TransactionHandle, ...);
Leave:
    ZwClose (TransactionHandle);
    return;

Sistem, işlem kaydı oluşturulduktan sonra ancak taahhüt edilmeden veya geri alınmadan önce kilitlenirse ne olur? Kaynak yöneticiniz her yüklendiğinde, ZwRecoverTransactionManager fonksiyonunu ve ZwRecoverResourceManagerfonksiyonunu çağırmalıdır. ZwRecoverTransactionManager çağrılması, KTM'nin günlük akışını açmasına ve işlem geçmişini okumasına neden olur. ZwRecoverResourceManager çağrılması, KTM'nin kilitlenmeden önce devam eden ve kaynak yöneticisinin kurtarması gereken listelenmiş işlemleri kaynak yöneticisine bildirmesine neden olur.

Kilitlenmeden önce bir işlem için ZwCommitTransaction adlı işlemi çağıran bir işlem istemcisi varsa ve bu işlem için işlem taahhüt operasyonlarını yürütmeye başladıysa, kaynak yöneticisinin işlemin durumunu kilitlenmeden hemen önceki noktaya geri yükleyebilmesi gerekir. İstemci çökmeden önce işlemi taahhüt etmeye hazır değilse, kaynak yöneticisi verileri silebilir ve işlemi geri alabilir.

İşlem istemcileri yazma hakkında daha fazla bilgi için bkz. İşlem İstemcisi Oluşturma.

Kaynak yöneticileri yazma hakkında daha fazla bilgi için bkz. Kaynak Yöneticisi Oluşturma.

TPS'de birden çok kaynak yöneticisi

Şimdi TPS'nizin istemcilerin tek bir işlem içinde iki ayrı veritabanındaki bilgileri değiştirmesine olanak sağladığını ve böylece işlemin yalnızca her iki veritabanının da değişikliklerinin başarılı olması durumunda başarılı olduğunu varsayalım.

Bu durumda, TPS'nizin her veritabanı için bir tane olmak üzere iki kaynak yöneticisi olabilir. Her kaynak yöneticisi, istemcilerin kaynak yöneticisinin veritabanına erişmek için kullanabileceği bir API'yi dışarı aktarabilir.

Aşağıdaki sahte kod, bir istemcinin iki kaynak yöneticisinin desteklediği iki veritabanındaki işlemleri içeren tek bir işlemi nasıl oluşturabileceğini gösterir.

Bu örnekte, istemci ilk veritabanındaki verileri okur ve ikinci veritabanına yazar. Ardından istemci ikinci veritabanındaki verileri okur ve ilk veritabanına yazar. (İlk kaynak yöneticisi Rm1ile başlayan işlevleri dışarı aktarır ve ikinci kaynak yöneticisi Rm2ile başlayan işlevleri dışarı aktarır.)

    ZwCreateTransaction (&TransactionHandle, ...);
    ZwQueryInformationTransaction (TransactionHandle, ...);
    Rm1CreateDataObject (TransactionID, &Rm1DataHandle);
    Rm2CreateDataObject (TransactionID, &Rm2DataHandle);
    Status = Rm1ReadData (Rm1DataHandle, &Rm1Data);
    if (Status == Error) goto ErrorRollback;
    Status = Rm2WriteData (Rm2DataHandle, Rm1Data);
    if (Status == Error) goto ErrorRollback;
    Status = Rm2ReadData (Rm2DataHandle, &Rm2Data);
    if (Status == Error) goto ErrorRollback;
    Status = Rm1WriteData (Rm1DataHandle, Rm2Data);
    if (Status == Error) goto ErrorRollback;
    ZwCommitTransaction (TransactionHandle, ...);
    goto Leave;
ErrorRollback:
    ZwRollbackTransaction (TransactionHandle, ...);
Leave:
    ZwClose (TransactionHandle);
    return;

İstemci aynı işlem tanımlayıcısını her iki kaynak yöneticisine de geçirdiğinden, her iki kaynak yöneticisi de ZwOpenTransaction çağırabilir ve ZwCreateEnlistment işleme kaydolabilir. İstemci sonunda ZwCommitTransaction'ı çağırdığında, KTM her kaynak yöneticisine yöneticinin işlemleri kalıcı hale getirmesi gerektiğini bildirir ve her kaynak yöneticisi tamamlandığında ZwCommitComplete'i çağırır.

Diğer TPS senaryoları

KTM diğer TPS senaryolarını destekler. Örneğin, aşağıdaki senaryolarda bir TPS'nin içerebileceği bileşenler açıklanmaktadır:

  • Birden çok veritabanını yöneten bir kaynak yöneticisi.

    Kaynak yöneticisinin API'si istemcilerin bir kerede birden fazla veritabanı açmasına ve bu veritabanına erişmesine olanak tanıyabilir ve istemci birden çok veritabanına erişimi tek bir işlemde birleştirebilir.

  • İstemcilerin çağırdığı bir API'ye sahip bir kaynak yöneticisi ve ilk kaynak yöneticisinin çağırdığı API'lere sahip diğer kaynak yöneticileri.

    İstemci yalnızca ilk kaynak yöneticisiyle iletişim kurar. Bu kaynak yöneticisi bir istemciden gelen istekleri işlediğinde, istemcinin isteklerini işlemek için gerektiğinde ek kaynak yöneticilerine erişebilir. Örneğin bir kaynak yöneticisi, istemcilerin erişebildiği bir veritabanını yönetir ve bu, istemcilerin erişemediği ikinci bir kaynak yöneticisinden yedekleme veya veri doğrulama işlemleri gerektirir.

  • KTM kullanmayan mevcut bir istemci ve kaynak yöneticisi, KTM kullanan ek bir kaynak yöneticisi kümesiyle tümleştirilmiştir.

    Bu durumda, genellikle mevcut kaynak yöneticisini değiştirerek KTM ile iletişim kuran üst işlem yöneticisi olması gerekir.