Pertanyaan: Saya menulis kelas operasi database TDBPerate_DL untuk menyatukan operasi pada database. Metode untuk mendeklarasikan permulaan transaksi, melakukan transaksi, dan mengembalikan transaksi disediakan untuk dipanggil oleh kelas lain. TDBOperate_DL = class PRivate ADOC:TADOConnection; ADOQ:TADOQuery; isDestroyADOC:Boolean; //Hancurkan ADOC Anda sendiri? fIsInTrans:Boolean; //Apakah transaksi telah dimulai public isCommit:Boolean; //Apakah akan melakukan transaksi, defaultnya adalah benar, jika sebuah kelas menolak penyerahan, itu adalah fungsi yang salah IsInTrans:Boolean; TADOConnection );overload; konstruktor Buat(const ServerName,DataBaseName,UserID,PassWord:String);overload; destructor Destroy;override; prosedur BeginTrans; CommitTrans; prosedur RollbackTrans; prosedur Jalankan(const sqlString:String); fungsi GetDataset(const sqlString:String):_Recordset; fungsi GetConnection:TADOConnection; prosedur SetConnection(const newADOC:TADOConnection); ; //Mulai transaksi mulai mandiri.ADOC.BeginTrans; self.fIsInTrans := true;end;procedure TDBOperate_DL.CommitTrans; //Komit transaksi dimulai self.ADOC.CommitTrans;=false;end;prosedur TDBOperate_DL.RollbackTrans; self.fIsInTrans := false;end;fungsi TDBPerate_DL.IsInTrans: Boolean; //Periksa apakah transaksi telah dimulai mulai hasil := self.fIsInTrans;end;Tulis kelas TThing untuk menambah, mengubah atau menghapus catatan tentang sesuatu ke database, panggil kelas TDBPerate_DL untuk menyelesaikan. Untuk kenyamanan panggilan, transaksi yang relevan ditempatkan di kelas TThing, dan tidak perlu mempertimbangkan transaksi tersebut saat melakukan panggilan eksternal. Misalnya: procedure Tthing.Drop(const thing:String);var sqlString:String;begin sqlString := pernyataan SQL yang dihapus; self.DBPerate.BeginTrans; // DBOperate adalah variabel privat bertipe TDBPerate_DL, yang diteruskan saat membuat Tthing parameter instance kelas. coba self.DBOperate.Execute(sqlString); self.DBOperate.CommitTrans; kecuali self.DBOperate.RollbackTrans; raise;end;end; Transaksi yang sama ditempatkan di kelas TPerson. Sekarang ketika saya ingin menghapus catatan seseorang, saya memanggil kelas TThing untuk menghapus hal-hal yang berhubungan dengan orang tersebut. Jika Anda menghapus TThing terlebih dahulu, lalu mendeklarasikan ulang transaksi untuk menghapus TPerson, jika TPerson membuat kesalahan, bagaimana cara mengembalikan TThing? Misalnya: procedure Tperson.Drop(const person:String);var sqlString:String; thing:Tthing;begin sqlString := pernyataan SQL yang dihapus := Tthing.Create(self.DBOperate); Diteruskan sebagai parameter. Self.DBOperate.BeginTrans; Coba Thing.Drop(person); //Ada transaksi di dalamnya, lihat kode di atas Self.DBOperate.Execute(sqlString); end;end ;Solusi, penyerahan dua tahap, pertama beberapa latar belakang pengetahuan: Tidak peduli sistem dua tingkat atau tiga tingkat, pemrosesan transaksi diwujudkan melalui penyerahan dua tahap. Pada fase pertama, setiap sumber daya/catatan yang dieksekusi ditulis ke dalam lingkungan transaksi (TranscationContext), dan kemudian koordinator sumber daya secara berurutan menanyakan apakah eksekusi setiap transaksi yang berpartisipasi berhasil eksekusi dimulai dengan Melakukan operasinya. Jika ada masalah dengan satu eksekusi, koordinator sumber daya memberi tahu semua eksekusi bawahan untuk menghentikan Komit dan memulihkan keadaan data asli. Mengacu pada operasi transaksi COM+, jika suatu komponen memerlukan transaksi, transaksi telah dimulai ketika komponen tersebut dibuat. Ketika komponen dimusnahkan, pemungutan suara transaksi dilakukan. Jika itu adalah transaksi root, maka transaksi tersebut dilakukan digulung kembali. (Jika komponen mendukung pengumpulan, kedua situasi ini terjadi dalam peristiwa aktivasi dan tidur komponen). Jadi kami mendefinisikan kelas sebagai berikut. //Kelas leluhur kelas bisnis, digunakan untuk menyediakan dukungan transaksi terpadu TTS_DL = class private isRootTrans:Boolean; //Apakah itu transaksi root isNeedTrans:Boolean; //Apakah suatu transaksi diperlukan public DBOperate:TDBOperate_DL; mengoperasikan prosedur Instance database SetComplete; prosedur SetAbort; Buat konstruktor (const newDBOperate:TDBOperate_DL; needTrans:Boolean);//Apakah destruktor dukungan transaksi diperlukan Destroy; database, tidak diperlukan transaksi. Kode implementasi kelasnya adalah sebagai berikut: konstruktor TTS_DL.Create(const newDBOperate: TDBOperate_DL; needTrans: Boolean);begin diwarisi Create;DBOperate := newDBOperate; .isNeedTrans kemudian mulai //Jika ada dalam suatu transaksi, itu bukan transaksi root, dan nilai isCommit dalam konteks transaksi tetap tidak berubah jika self.DBOperate.isInTrans lalu self.isRootTrans := false else start self.DBOperate.BeginTrans; //Jika ini adalah transaksi root, mulai transaksi self.isRootTrans := true; Inisialisasi flag komit Untuk melakukan transaksi end;end;destructor TTS_DL.Destroy;begin jika self.isNeedTrans kemudian mulai //Jika itu adalah transaksi root, komit atau kembalikan transaksi sesuai dengan hasil pemungutan suara jika self.isRootTrans kemudian mulai jika self.DBOperate.isCommit kemudian self.DBOperate.CommitTrans else self.DBOperate.RollbackTrans diwarisi akhir; akhir; prosedur TTS_DL.SetAbort;mulai self.DBOperate.isCommit := self.DBOperate.isCommit Dan salah; //Pilih rollbackend;procedure TTS_DL.SetComplete;begin self.DBOperate.isCommit := self.DBOperate.isCommit Dan true; //Pilih untuk commitend;Kembali ke kelas bisnis Tthing dan Tperson, kali ini Semua diwarisi dari kelas TTS_DL. Tthing = class(TTS_DL); Tperson = class(TTS_DL); Kode penghapusan Tthing harus sebagai berikut: procedure Tthing.Drop(const thing:String);var sqlString:String;begin sqlString := pernyataan SQL yang dihapus; . DBOperate.Execute(sqlString); DBOperate.SetComplete; //Pengajuan suara kecuali mandiri. DBOperate.SetAbort; //Vote rollback raise; end;end; Kode penghapusan Tperson adalah sebagai berikut: procedure Tperson.Drop(const person:String);var sqlString:String; thing:Tthing;begin sqlString := pernyataan SQL yang dihapus; := Tthing.Create(self.DBOperate,true); //TDBOperate_DL tipe DBOperate diteruskan sebagai parameter, true berarti diperlukan transaksi. Coba Coba Thing.Drop(person); Self.DBOperate.Execute(sqlString); self.DBOperate.SetComplete; //Pengajuan suara kecuali self. //Ingatlah untuk melepaskan end;end; Ingatlah untuk menyimpan satu-satunya instance dari kelas database operasi TDBOperate_DL yang digunakan dalam program, dan ingatlah untuk melepaskan instance kelas bisnis. Jika diperlukan transaksi, lepaskan sedini mungkin, oke, Selesai. Versi pertama memiliki level terbatas dan perlu ditingkatkan dalam aplikasi praktis. Ini hanyalah cara untuk menarik ide-ide baru. Mohon pahlawan berpengalaman untuk berkontribusi :)