Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM · Pelajaran

Memori Transaksi Perisian (STM)

Fahami cara STM Clojure menyediakan transaksi atomik, konsisten, terpencil dan tahan lama (ACID) untuk keadaan dikongsi

Pelajaran 2 daripada 411 langkah

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 Ref menyimpan nilai yang boleh diubah, tetapi hanya dalam transaksi.
  • Anda mencipta Ref dengan 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.

  • dosync mentakrifkan blok transaksi.
  • Semua perubahan pada Refs dalam dosync dianggap 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-fn ialah fungsi yang digunakan pada nilai semasa Ref.
  • & args ialah argumen tambahan yang dihantar kepada update-fn.
  • alter akan mencuba semula transaksi jika konflik (transaksi lain mengubah suai Ref yang 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)

  • commute menandakan 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 dosync memastikan transaksi atom.
  • alter mengemas kini Refs dengan pengesanan konflik dan percubaan semula.
  • commute mengoptimumkan 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!

Percuma untuk bermula

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

  1. Ref, Ejen dan Atom untuk Keadaan
  2. Memori Transaksi Perisian (STM)
  3. Janji, Masa Hadapan dan Operasi Tak Segerak
  4. Saluran core.async dan Blok Go
← Kembali ke Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM