Memori Transaksi Perisian (STM)
Fahami cara STM Clojure menyediakan transaksi atomik, konsisten, terpencil dan tahan lama (ACID) untuk keadaan dikongsi
Memori Transaksi Perisian (STM) ialah pelajaran Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM merangkumi sejumlah 4 pelajaran.
Apakah Memori Transaksi Perisian?
Bayangkan pemindahan wang bank: anda tidak mahu wang hilang atau muncul entah dari mana. Anda mahu keseluruhan operasi berjaya atau gagal sepenuhnya.
Memori Transaksi Perisian (STM) dalam Clojure menyediakan jaminan yang serupa untuk mengurus keadaan dikongsi dan boleh ubah dalam atur cara serentak.
- Ia seperti sistem transaksi pangkalan data mini untuk memori aplikasi anda.
- Ia memastikan operasi pada data dikongsi berlaku secara "semua atau tiada".
Mengapa Kita Memerlukan STM
Dalam pengaturcaraan serentak, beberapa bahagian kod anda mungkin cuba mengubah cebisan data yang sama pada masa yang sama. Hal ini boleh menyebabkan:
- Keadaan perlumbaan: Hasilnya bergantung pada pemasaan operasi yang tidak dapat diramal.
- Keadaan tidak konsisten: Data menjadi rosak atau hanya dikemas kini sebahagiannya.
STM membantu mencegah masalah ini dengan menyelaraskan akses kepada data dikongsi dan memastikan integriti data.
Memperkenalkan `Ref`s Clojure
STM Clojure mengurus bekas data khas yang dipanggil Refs. Tidak seperti pemboleh ubah biasa, Refs direka untuk kemas kini bertransaksi.
- Satu
Refmenyimpan nilai yang boleh diubah, tetapi hanya dalam transaksi. - Anda mencipta
Refdengan nilai awal menggunakan(ref initial-value).
Anggaplah Ref sebagai peti besi selamat untuk data anda yang hanya terbuka untuk transaksi.
Kemas Kini Atom dengan `dosync`
Untuk menjalankan operasi pada Refs, anda mesti membungkusnya dalam makro dosync.
dosyncmentakrifkan blok transaksi.- Semua perubahan pada
Refs dalamdosyncdianggap sebagai satu unit atom. - Jika mana-mana bahagian transaksi gagal, semua perubahan akan dikembalikan.
Ini memastikan data anda kekal konsisten walaupun dengan akses serentak.
Mengubah Suai `Ref`s: `alter`
Dalam blok dosync, anda menggunakan alter untuk mengubah nilai Ref.
(alter a-ref update-fn & args)
update-fnialah fungsi yang digunakan pada nilai semasaRef.& argsialah argumen tambahan yang dihantar kepadaupdate-fn.alterakan mencuba semula transaksi jika konflik (transaksi lain mengubah suaiRefyang sama) dikesan.
`dosync` & `alter` dalam Tindakan
Contoh ini menunjukkan cara `dosync` dan `alter` berfungsi bersama. Kita akan mengemas kini satu Ref beberapa kali dalam satu transaksi.
(def balance (ref 100))
(defn deposit [amount]
(dosync
(println "Current balance (inside transaction):" @balance)
(alter balance + amount)
(println "New balance (inside transaction):" @balance)))
(defn -main []
(println "Initial balance:" @balance)
(deposit 50)
(println "Final balance:" @balance))
(-main)`commute` untuk Perubahan Bebas
Kadang-kadang, susunan operasi tidak penting, seperti menambah item pada senarai atau mengira. Untuk operasi sedemikian, gunakan commute dan bukannya alter.
(commute a-ref update-fn & args)
commutemenandakan kemas kini sebagai "komutatif".- Ini boleh mengurangkan kemungkinan transaksi perlu dicuba semula, sekali gus meningkatkan prestasi.
- Ia paling sesuai untuk operasi yang `(f (f x a) b)` sama dengan `(f (f x b) a)`.
`commute` dengan Berbilang Jalur
Berikut ialah contoh beberapa jalur yang meningkatkan pembilang secara serentak menggunakan `commute`. Contoh ini menunjukkan cara STM mengurus keadaan dikongsi dengan selamat dan cekap.
(def counter (ref 0))
(defn increment-counter []
(dosync
(commute counter inc)))
(defn -main []
(println "Initial counter:" @counter)
(let [futures (doall (for [_ (range 10)]
(future (dotimes [_ 100] (increment-counter)))))]
(doseq [f futures] @f)) ; Wait for all futures to complete
(println "Final counter:" @counter))
(-main)Jaminan ACID STM
STM Clojure menyediakan jaminan kukuh yang sering diringkaskan dengan akronim ACID:
- Keatomikan: Semua atau tiada. Transaksi sama ada selesai sepenuhnya atau gagal sepenuhnya.
- Kekonsistenan: Transaksi membawa data daripada satu keadaan sah kepada keadaan sah yang lain.
- Pengasingan: Transaksi serentak kelihatan seperti dilaksanakan secara berturutan, lalu menghalang gangguan.
- Ketahanan: (Kurang berkaitan secara langsung dengan STM dalam memori, tetapi tersirat oleh komit yang berjaya) Setelah transaksi dilakukan, perubahannya kekal.
Semakan Pantas STM
Pertimbangkan coretan kod Clojure berikut:
(def data (ref []))
(defn add-item [item]
(dosync
(alter data conj item)))
(add-item 10)
(add-item 20)
(println @data)Apakah output akhir bagi (println @data)?
Imbas Kembali STM & Seterusnya
Dalam pelajaran ini, kita meneroka sistem Memori Transaksi Perisian (STM) Clojure yang berkuasa.
- Kita mempelajari
Refs untuk mengurus keadaan dikongsi. - Makro
dosyncmemastikan transaksi atom. altermengemas kiniRefs dengan pengesanan konflik dan percubaan semula.commutemengoptimumkan kemas kini untuk operasi komutatif.- STM menyediakan jaminan ACID untuk keserentakan yang kukuh.
Seterusnya, kita akan melihat primitif keserentakan lain seperti Promises dan Futures untuk operasi tak segerak!
Pelajari Clojure dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 12
- Pelajaran
- 48
Soalan Lazim
Adakah pelajaran “Memori Transaksi Perisian (STM)” percuma?
Ya — teks penuh “Memori Transaksi Perisian (STM)” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM, tingkat taraf kepada CoddyKit PRO. Kursus Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Memori Transaksi Perisian (STM)”?
Fahami cara STM Clojure menyediakan transaksi atomik, konsisten, terpencil dan tahan lama (ACID) untuk keadaan dikongsi Anda berlatih Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Memori Transaksi Perisian (STM)” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM ini?
Ya. Setiap pelajaran Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Ref, Ejen dan Atom untuk Keadaan
- Memori Transaksi Perisian (STM)
- Janji, Masa Hadapan dan Operasi Tak Segerak
- Saluran core.async dan Blok Go