Üretime hazır bir web uygulaması oluşturmak, güvenli ve ölçeklenebilir olduğundan emin olmanızı gerektirir.
Veritabanları hakkında bilinmesi gereken en önemli şeylerden biri, atomsallık, tutarlılık, izolasyon ve dayanıklılık anlamına gelen ACID ilkesidir. MySQL gibi ilişkisel veritabanları, ACID işlemlerini yerel olarak destekler. Ancak MongoDB bir NoSQL veritabanıdır ve varsayılan olarak ACID işlemlerini desteklemez.
Bir programcı olarak, ACID özelliklerini MongoDB veritabanlarınıza nasıl ekleyeceğinizi bilmelisiniz.
Veritabanı İşlemleri Nelerdir?
Bir veritabanı işlemi, bir görevi tamamlamak için hepsi bir birim olarak birlikte yürütülen bir dizi veritabanı sorgusu veya işlemidir.
Veritabanı işlemleri, ACID özellikleri kavramlarına uygundur. Bu, tüm işlemler başarılı olmadıkça hiçbir değişiklik yapılmamasını sağlamaya yardımcı olur. Ayrıca veritabanının tutarlı olmasını sağlar.
ASİT Özellikleri Açıklandı
ACID ilkelerini oluşturan dört özellik şunlardır:
- Atomisite , işlemleri bir programın küçük birimleri olarak kavramsallaştıran özelliktir. Bu, tüm sorguların başarılı bir şekilde çalıştığı veya birlikte başarısız olduğu anlamına gelir.
- Tutarlılık , veritabanı kayıtlarının her işlemden önce ve sonra tutarlı kalması gerektiğini belirtir.
- İzolasyon , birden fazla işlemin aynı anda çalıştığında birinin diğerini etkilememesini sağlar.
- Dayanıklılık , sistem arızalarına veya arızalarına odaklanır. Sistem arızası durumunda taahhüt edilen bir işlemin kaybolmamasını sağlar. Bu, sistem tekrar açıldığında verileri bir yedekten otomatik olarak geri yüklemek için gerekli teknikleri içerebilir.
Mongoose Kullanarak Node.js’de MongoDB Veritabanı İşlemleri Nasıl Uygulanır?
MongoDB, NoSQL yapısı ve esnek belge tabanlı modeli nedeniyle yıllar içinde yaygın olarak kullanılan bir veritabanı teknolojisi haline geldi. Ayrıca, verilerinizi SQL veya ilişkisel veritabanlarından daha iyi ve daha esnek bir şekilde düzenleme olanağı sunar.
MongoDB’de veritabanı işlemlerini uygulamak için, bir kullanıcının bir işi gönderebileceği, güncelleyebileceği veya silebileceği bir iş listeleme uygulamasında örnek bir senaryo düşünebilirsiniz. İşte bu uygulama için basit bir veritabanı şeması tasarımı:
Kullanıcı ve İş koleksiyonları için şema diyagramı
Devam etmek için bu bölüm, Node.js programlama ve MongoDB hakkında temel bilgi gerektirir.
İşlemler, bağımsız MongoDB kurulumlarında desteklenmez. İşlemlerin çalışması için bir MongoDB çoğaltma kümesi veya MongoDB parçalanmış kümesi kullanmanız gerekir. Bu nedenle, işlemleri kullanmanın en kolay yolu, bulutta barındırılan bir MongoDB örneği (MongoDB Atlas) oluşturmaktır. Varsayılan olarak, her Atlas veritabanı örneği, bir çoğaltma kümesi veya parçalanmış kümedir.
Çalışan bir Node.js ve MongoDB projesi kurduktan sonra, Node.js’de bir Mongo veritabanına bağlantı kurabilirsiniz. Daha önce yapmadıysanız , terminalinizde npm install mongoose çalıştırarak mongoose yükleyin.
import mongoose from ‘mongoose’
let MONGO_URL = process.env.MONGO_URL || ‘your-mongo-database-url’;
let connection;
const connectDb = async () => {
try {
await mongoose.connect(MONGO_URL, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
console.log(“CONNECTED TO DATABASE”);
connection = mongoose.connection;
} catch (err) {
console.error(“DATABASE CONNECTION FAILED!”);
console.error(err.message);
process.exit(1); // close the app if database connection fails
}
};
Bağlantıyı bir değişkende saklamalısınız, böylece programda daha sonra bir işlem başlatmak için kullanabilirsiniz.
Kullanıcıları ve iş koleksiyonlarını şu şekilde uygulayabilirsiniz:
const userSchema = new mongoose.Schema({
name: String,
email: String,
jobs: [mongoose.Schema.Types.ObjectId]
});
const jobSchema = new mongoose.Schema({
title: String,
location: String,
salary: String,
poster: mongoose.Schema.Types.ObjectId
});
const userCollection = mongoose.model(‘user’, userSchema);
const jobCollection = mongoose.model(‘job’, jobSchema);
Veritabanına bir kullanıcı eklemek için şöyle bir fonksiyon yazabilirsiniz:
const createUser = async (user) => {
const newUser = await userCollection.create(user);
console.log(“User added to database”);
console.log(newUser);
}
Aşağıdaki kod, bir iş yaratma ve bir veritabanı işlemi kullanarak onu posterin iş listesine ekleme işlevini gösterir.
const createJob = async (job) => {
const { userEmail, title, location, salary } = job;
// get the user from the DB
const user = await userCollection.findOne({ email: userEmail });
// start transaction session
const session = await connection.startSession();
// run all database queries in a try-catch block
try {
await session.startTransaction();
// create job
const newJob = await jobCollection.create(
[
{
title,
location,
salary,
poster: user._id,
},
],
{ session }
);
console.log(“Created new job successfully!”);
console.log(newJob[0]);
// add job to users list of posted jobs
const newJobId = newJob[0]._id;
const addedToUser = await userCollection.findByIdAndUpdate(
user._id,
{ $addToSet: { jobs: newJobId } },
{ session }
);
console.log(“Successfully added job to user’s jobs list”);
console.log(addedToUser);
await session.commitTransaction();
console.log(“Successfully carried out DB transaction”);
} catch (e) {
console.error(e);
console.log(“Failed to complete database operations”);
await session.abortTransaction();
} finally {
await session.endSession();
console.log(“Ended transaction session”);
}
};
Bir işlemde çalışan bir oluşturma sorgusu genellikle alır ve bir dizi döndürür. Bunu, newJob oluşturduğu ve _id özelliğini newJobId değişkeninde sakladığı yukarıdaki kodda görebilirsiniz.
İşte yukarıdaki işlevlerin nasıl çalıştığının bir gösterimi:
const mockUser = {
name: “Timmy Omolana”,
email: “jobposter@example.com”,
};
const mockJob = {
title: “Sales Manager”,
location: “Lagos, Nigeria”,
salary: “$40,000”,
userEmail: “jobposter@example.com”, // email of the created user
};
const startServer = async () => {
await connectDb();
await createUser(mockUser);
await createJob(mockJob);
};
startServer()
.then()
.catch((err) => console.log(err));
Bu kodu kaydedip npm start veya node komutunu kullanarak çalıştırırsanız, şöyle bir çıktı üretmelidir:
Mongoose kullanarak MongoDB’de ACID işlemlerini uygulamanın başka bir yolu withTransaction() işlevini kullanmaktır. Bu yaklaşım, işleve argüman olarak ilettiğiniz bir geri çağırma işlevi içindeki tüm sorguları çalıştırdığı için çok az esneklik sağlar.
Aşağıdaki gibi withTransaction() kullanmak için yukarıdaki veritabanı işlemini yeniden düzenleyebilirsiniz :
const createJob = async (job) => {
const { userEmail, title, location, salary } = job;
// get the user from the DB
const user = await userCollection.findOne({ email: userEmail });
// start transaction session
const session = await connection.startSession();
// run all database queries in a try-catch block
try {
const transactionSuccess = await session.withTransaction(async () => {
const newJob = await jobCollection.create(
[
{
title,
location,
salary,
poster: user._id,
},
],
{ session }
);
console.log(“Created new job successfully!”);
console.log(newJob[0]);
// add job to users list of posted jobs
const newJobId = newJob[0]._id;
const addedToUser = await userCollection.findByIdAndUpdate(
user._id,
{ $addToSet: { jobs: newJobId } },
{ session }
);
console.log(“Successfully added job to user’s jobs list”);
console.log(addedToUser);
});
if (transactionSuccess) {
console.log(“Successfully carried out DB transaction”);
} else {
console.log(“Transaction failed”);
}
} catch (e) {
console.error(e);
console.log(“Failed to complete database operations”);
} finally {
await session.endSession();
console.log(“Ended transaction session”);
}
};
Bu, önceki uygulama ile aynı çıktıyı üretecektir. MongoDB’de veritabanı işlemlerini uygularken hangi stili kullanacağınızı seçmekte özgürsünüz.
Bu uygulama, commitTransaction() ve abortTransaction() işlevlerini kullanmaz. Bunun nedeni withTransaction() işlevinin otomatik olarak başarılı işlemleri tamamlaması ve başarısız olanları iptal etmesidir. Her durumda çağırmanız gereken tek işlev session.endSession() işlevidir.
MongoDB’de ACID Veritabanı İşlemlerini Uygulamak
Veritabanı işlemleri doğru yapıldığında kullanımı kolaydır. Artık MongoDB’de Veritabanı işlemlerinin nasıl çalıştığını ve bunları Node.js uygulamalarında nasıl uygulayabileceğinizi anlamalısınız.
ACID işlemleri fikrini ve MongoDB’de nasıl çalıştıklarını daha fazla keşfetmek için bir fintech cüzdanı veya blog uygulaması oluşturmayı düşünün.