Jika anda menulis perkhidmatan web, kemungkinan besar anda berinteraksi dengan pangkalan data. Kadangkala, anda perlu membuat perubahan yang mesti digunakan secara atom — sama ada semuanya berjaya, atau tidak ada. Di sinilah urus niaga masuk. Dalam artikel ini, saya akan menunjukkan kepada anda cara melaksanakan transaksi dalam kod anda untuk mengelakkan isu dengan abstraksi bocor.
Contoh
Contoh biasa ialah memproses pembayaran:
- Anda perlu mendapatkan baki pengguna dan semak sama ada ia mencukupi.
- Kemudian, anda mengemas kini baki dan menyimpannya.
Struktur
Lazimnya, aplikasi anda akan mempunyai dua modul untuk memisahkan logik perniagaan daripada kod berkaitan pangkalan data.
Modul Repositori
Modul ini mengendalikan semua operasi berkaitan pangkalan data, seperti pertanyaan SQL. Di bawah, kami mentakrifkan dua fungsi:
- get_balance — Mendapatkan semula baki pengguna daripada pangkalan data.
- set_balance — Mengemas kini baki pengguna.
import { Injectable } from '@nestjs/common'; import postgres from 'postgres'; @Injectable() export class BillingRepository { constructor( private readonly db_connection: postgres.Sql, ) {} async get_balance(customer_id: string): Promise<number null> { const rows = await this.db_connection` SELECT amount FROM balances WHERE customer_id=${customer_id} `; return (rows[0]?.amount) ?? null; } async set_balance(customer_id: string, amount: number): Promise<void> { await this.db_connection` UPDATE balances SET amount=${amount} WHERE customer_id=${customer_id} `; } } </void></number>
Modul Perkhidmatan
Modul perkhidmatan mengandungi logik perniagaan, seperti mengambil baki, mengesahkannya dan menyimpan baki yang dikemas kini.
import { Injectable } from '@nestjs/common'; import { BillingRepository } from 'src/billing/billing.repository'; @Injectable() export class BillingService { constructor( private readonly billing_repository: BillingRepository, ) {} async bill_customer(customer_id: string, amount: number) { const balance = await this.billing_repository.get_balance(customer_id); // The balance may change between the time of this check and the update. if (balance === null || balance <p>Dalam fungsi bill_customer, kami mula-mula mendapatkan semula baki pengguna menggunakan get_balance. Kemudian, kami menyemak sama ada baki itu mencukupi dan mengemas kininya dengan set_balance.</p> <h2> Transaksi </h2> <p>Masalah dengan kod di atas ialah baki boleh berubah antara masa ia diambil dan dikemas kini. Untuk mengelakkan perkara ini, kita perlu menggunakan <strong>transaksi</strong>. Anda boleh mengendalikan perkara ini dalam dua cara:</p>
- Benamkan logik perniagaan dalam modul repositori: Pendekatan ini menggabungkan peraturan perniagaan dengan operasi pangkalan data, menjadikan ujian lebih sukar.
- Gunakan transaksi dalam modul perkhidmatan: Ini boleh menyebabkan abstraksi bocor, kerana modul perkhidmatan perlu mengurus sesi pangkalan data secara eksplisit.
Sebaliknya, saya mengesyorkan pendekatan yang lebih bersih.
Kod Transaksi
Cara yang baik untuk mengendalikan urus niaga ialah dengan mencipta fungsi yang membungkus panggilan balik dalam transaksi. Fungsi ini menyediakan objek sesi yang tidak mendedahkan butiran dalaman yang tidak perlu, menghalang abstraksi bocor. Objek sesi dihantar ke semua fungsi berkaitan pangkalan data dalam transaksi.
Begini cara anda boleh melaksanakannya:
import { Injectable } from '@nestjs/common'; import postgres, { TransactionSql } from 'postgres'; export type SessionObject = TransactionSql<record unknown>>; @Injectable() export class BillingRepository { constructor( private readonly db_connection: postgres.Sql, ) {} async run_in_session<t>(cb: (sql: SessionObject) => T | Promise<t>) { return await this.db_connection.begin((session) => cb(session)); } async get_balance( customer_id: string, session: postgres.TransactionSql | postgres.Sql = this.db_connection ): Promise<number null> { const rows = await session` SELECT amount FROM balances WHERE customer_id=${customer_id} `; return (rows[0]?.amount) ?? null; } async set_balance( customer_id: string, amount: number, session: postgres.TransactionSql | postgres.Sql = this.db_connection ): Promise<void> { await session` UPDATE balances SET amount=${amount} WHERE customer_id=${customer_id} `; } } </void></number></t></t></record>
Dalam contoh ini, fungsi run_in_session memulakan transaksi dan melaksanakan panggilan balik di dalamnya. Jenis SessionObject mengabstrakkan sesi pangkalan data untuk mengelakkan butiran dalaman bocor. Semua fungsi berkaitan pangkalan data kini menerima objek sesi, memastikan mereka boleh mengambil bahagian dalam transaksi yang sama.
Modul Perkhidmatan Kemas Kini
Modul perkhidmatan dikemas kini untuk memanfaatkan transaksi. Begini rupanya:
import { Injectable } from '@nestjs/common'; import postgres from 'postgres'; @Injectable() export class BillingRepository { constructor( private readonly db_connection: postgres.Sql, ) {} async get_balance(customer_id: string): Promise<number null> { const rows = await this.db_connection` SELECT amount FROM balances WHERE customer_id=${customer_id} `; return (rows[0]?.amount) ?? null; } async set_balance(customer_id: string, amount: number): Promise<void> { await this.db_connection` UPDATE balances SET amount=${amount} WHERE customer_id=${customer_id} `; } } </void></number>
Dalam fungsi bill_customer_transactional, kami memanggil run_in_session dan menghantar panggilan balik dengan objek sesi sebagai parameter, kemudian kami menghantar parameter ini kepada setiap fungsi repositori yang kami panggil. Ini memastikan bahawa kedua-dua get_balance dan set_balance dijalankan dalam transaksi yang sama. Jika baki berubah antara kedua-dua panggilan, transaksi akan gagal, mengekalkan integriti data.
Kesimpulan
Menggunakan transaksi dengan berkesan memastikan operasi pangkalan data anda kekal konsisten, terutamanya apabila berbilang langkah terlibat. Pendekatan yang saya gariskan membantu anda mengurus urus niaga tanpa membocorkan abstraksi, menjadikan kod anda lebih mudah diselenggara. Cuba laksanakan corak ini dalam projek anda yang seterusnya untuk memastikan logik anda bersih dan data anda selamat!
Terima kasih kerana membaca!
?Jangan lupa like jika anda menyukai artikel tersebut?
Kenalan
Jika anda menyukai artikel ini, jangan teragak-agak untuk berhubung di LinkedIn dan ikuti saya di Twitter.
Langgan senarai mel saya: https://sergedevs.com
Pastikan suka dan ikuti ?
Atas ialah kandungan terperinci Cara Menulis Panggilan Pangkalan Data Transaksi dalam TypeScript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Aplikasi JavaScript di dunia nyata termasuk pengaturcaraan sisi pelayan, pembangunan aplikasi mudah alih dan Internet of Things Control: 1. Pengaturcaraan sisi pelayan direalisasikan melalui node.js, sesuai untuk pemprosesan permintaan serentak yang tinggi. 2. Pembangunan aplikasi mudah alih dijalankan melalui reaktnatif dan menyokong penggunaan silang platform. 3. Digunakan untuk kawalan peranti IoT melalui Perpustakaan Johnny-Five, sesuai untuk interaksi perkakasan.

Saya membina aplikasi SaaS multi-penyewa berfungsi (aplikasi edTech) dengan alat teknologi harian anda dan anda boleh melakukan perkara yang sama. Pertama, apakah aplikasi SaaS multi-penyewa? Aplikasi SaaS Multi-penyewa membolehkan anda melayani beberapa pelanggan dari Sing

Artikel ini menunjukkan integrasi frontend dengan backend yang dijamin oleh permit, membina aplikasi edtech SaaS yang berfungsi menggunakan Next.Js. Frontend mengambil kebenaran pengguna untuk mengawal penglihatan UI dan memastikan permintaan API mematuhi dasar peranan

JavaScript adalah bahasa utama pembangunan web moden dan digunakan secara meluas untuk kepelbagaian dan fleksibiliti. 1) Pembangunan front-end: Membina laman web dinamik dan aplikasi satu halaman melalui operasi DOM dan kerangka moden (seperti React, Vue.js, sudut). 2) Pembangunan sisi pelayan: Node.js menggunakan model I/O yang tidak menyekat untuk mengendalikan aplikasi konkurensi tinggi dan masa nyata. 3) Pembangunan aplikasi mudah alih dan desktop: Pembangunan silang platform direalisasikan melalui reaktnatif dan elektron untuk meningkatkan kecekapan pembangunan.

Trend terkini dalam JavaScript termasuk kebangkitan TypeScript, populariti kerangka dan perpustakaan moden, dan penerapan webassembly. Prospek masa depan meliputi sistem jenis yang lebih berkuasa, pembangunan JavaScript, pengembangan kecerdasan buatan dan pembelajaran mesin, dan potensi pengkomputeran IoT dan kelebihan.

JavaScript adalah asas kepada pembangunan web moden, dan fungsi utamanya termasuk pengaturcaraan yang didorong oleh peristiwa, penjanaan kandungan dinamik dan pengaturcaraan tak segerak. 1) Pengaturcaraan yang didorong oleh peristiwa membolehkan laman web berubah secara dinamik mengikut operasi pengguna. 2) Penjanaan kandungan dinamik membolehkan kandungan halaman diselaraskan mengikut syarat. 3) Pengaturcaraan Asynchronous memastikan bahawa antara muka pengguna tidak disekat. JavaScript digunakan secara meluas dalam interaksi web, aplikasi satu halaman dan pembangunan sisi pelayan, sangat meningkatkan fleksibiliti pengalaman pengguna dan pembangunan silang platform.

Python lebih sesuai untuk sains data dan pembelajaran mesin, manakala JavaScript lebih sesuai untuk pembangunan front-end dan penuh. 1. Python terkenal dengan sintaks ringkas dan ekosistem perpustakaan yang kaya, dan sesuai untuk analisis data dan pembangunan web. 2. JavaScript adalah teras pembangunan front-end. Node.js menyokong pengaturcaraan sisi pelayan dan sesuai untuk pembangunan stack penuh.

JavaScript tidak memerlukan pemasangan kerana ia sudah dibina dalam pelayar moden. Anda hanya memerlukan editor teks dan penyemak imbas untuk memulakan. 1) Dalam persekitaran penyemak imbas, jalankan dengan memasukkan fail HTML melalui tag. 2) Dalam persekitaran Node.js, selepas memuat turun dan memasang node.js, jalankan fail JavaScript melalui baris arahan.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

MinGW - GNU Minimalis untuk Windows
Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.

EditPlus versi Cina retak
Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

SublimeText3 Linux versi baharu
SublimeText3 Linux versi terkini