[MongoDB] Lock
MongoDB๋ ์ฌํ DB๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์์ฑ ์ ์ด๋ฅผ ์ํ Lock ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Lock mode
MongoDB๋ ํฌ๊ฒ 2๊ฐ์ง์ Lock ๋งค์ปค๋์ฆ์ ์ง์ํ๋ค.
-
Shared Lock: lock์ ์ ์ ํ ๋ฐ์ดํฐ๋ ๋ค๋ฅธ write๊ฐ ๋ค์ด์ฌ ์ ์๋ค. ํ์ง๋ง ์ฌ๋ฌ๊ฐ์ read๋ ํ์ฉํ๋ค.(RWLock)
-
Exclusive Lock: lock์ ์ ์ ํ ๋ฐ์ดํฐ๋ ๋ค๋ฅธ read/write๊ฐ ์ ๋ถ ๋ค์ด์ฌ ์ ์๋ค.
์ธ๋ถํํ๋ฉด Intent.. ์ด์ฉ๊ณ ํ๋๊ฒ ๋ ์๊ธด ํ๋ฐ, ๊ธฐ๋ณธ์ ์ธ ์๋ฆฌ๋ ์ฌ๊ธฐ์์ ๋ฒ์ด๋์ง ์๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ ์ฐ์ฐ์ ๊ธฐ๋ณธ Lock ๋์์ ๋ค์๊ณผ ๊ฐ๋ค. r์ด Shared Lock์ด๊ณ , w๊ฐ Exclusive Lock์ด๋ค.
https://www.mongodb.com/docs/manual/faq/concurrency/
๋๋ถ๋ถ์ mutable ์ฐ์ฐ์ด Exclusive Lock์ด๊ณ readonly ์ฐ์ฐ์ด Shared Lock์์ ์ ์ ์๋ค.
์ด๋ฌํ Lock ๊ธฐ๋ฅ์ ํตํด MongoDB๋ document ๋จ์์ atomic์ ๋ณด์ฅํ๋ค.
Lock ์ถฉ๋์์ ๋์
๋์์ ์ฌ๋ฌ๊ฐ์ operation๋ค์ ์ํํ๋ค๋ณด๋ฉด, Lock์ด ์ด๋ฏธ ๊ฑธ๋ฆฐ ์ํ์์ ๋๋ค๋ฅธ write operation์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๊ฒ์ด๋ค.
์ด๋ด ๋ ๊ธฐ์กด์ RDB๋ค์ Lock์ด ํ๋ฆด๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ Lock์ด ํ๋ฆฌ๋ฉด ๋ง์ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๋ฐฉ์์ ์ทจํ๋๋ฐ, MongoDB์ ํด๊ฒฐ๋ฐฉ์์ ๊ฝค ๋
ํนํ๋ค.
https://rastalion.me/mongodb-transaction-management/
์ด๋ฏธ Lock์ด ๊ฑธ๋ ค์๋ ๋ฐ์ดํฐ์ write๋ฅผ ์๋ํ๋ฉด, ๋ชฝ๊ณ ์๋ฒ๋ ๊ทธ์ ๋ํด ์๋ฌ๋ฅผ ๋์ง๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ฌ๊ฐ ๋๋ฉด ๋ค์ ์๋ํ๊ณ , ๋ค์ ์๋ํ๊ณ ... ์ ๋ฐฉ๋ฒ์ ๊ณ์ ์ฌ์ฉํ๋ค.
MongoDB ๋ด๋ถ์์๋ง ์ผ์ด๋๋ ์ผ์ด๋ผ ์ฌ์ฉ์ ํฐ ๋ถํธํจ์ ์์ง๋ง, ์ด๊ฒ ๋๋ฌด ๋์ด๋๋ฉด ์ฑ๋ฅ์ ์ง์ฅ์ ์ฃผ๊ฒ ๋๋ค.
CPU ์ฌ์ฉ๋๋ ๋งค์ฐ ์ปค์ง๊ณ , ๋ด๋ถ์ WiredTiger ์บ์์๋ ๋ถ๋ด์ ์ค์ ์ ์ฒด์ ์ธ ์ฑ๋ฅ์ ์ ํ์ํค๊ธฐ ๋๋ฌธ์ด๋ค...
multi-document transaction
์ด๊ฒ ๋ญ๋๋ฉด, RDB์์ ์ฐ๋ ๊ทธ ์๋ ํธ๋์ญ์
๊ธฐ๋ฅ์ ๋งํ๋ค.
์ฌ๋ฌ๊ฐ์ operation์ ํ๋๋ก ๋ฌถ์ด์ ํ๋์ Lock ๋จ์๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค.
MongoDB๋ NoSQL์ด๋ฉด์๋ RDB์ ์์ญ๊น์ง ๋ ธ๋ฆฌ๋ ์ ๋งคํ ๋ ์์ด๋ผ์, ์ด๋ฐ๊ฒ๋ ๋น์ทํ๊ฒ ์ง์ํ๋ค...
๋ฆฌ์์ค๋ฅผ ๋๋จํ ๋ง์ด ๋จน์ ์ ์๋ ๊ธฐ๋ฅ์ด๋ผ ๊ถ์ฅ๋์ง๋ ์๋๋ค.
์ฌ์ ์กฐ๊ฑด์ด ํ๋ ์๋ค. MongoDB ์๋ฒ๊ฐ ๋ฌด์กฐ๊ฑด ๋จ์ผ ์ธ์คํด์ค๊ฐ ์๋๋ผ replicaset ๋ชจ๋์ฌ์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
๊ทผ๋ฐ ๋ ํ๋ฆฌ์นด์ธ๊ฑฐ๋ ํธ๋์ญ์
์๋์ฌ๋ถ๊ฐ ๋์ฒด ๋ฌด์จ ์๊ด์ด์ง...? ์ด๊ฑด ๋ชฝ๊ณ ๊ฐ๋ฐ์๋ค ์ค์์ธ๊ฑฐ๊ฐ๋ค.
์๋๋ Node.js ๊ธฐ๋ฐ์ ๊ฐ๋จํ transaction ์ฌ์ฉ ์์ ๋ค.
const { MongoClient } = require("mongodb");
const url =
"mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.0&replicaSet=rs0";
const client = new MongoClient(url);
async function main() {
await client.connect();
// ์ธ์
์์
const session = client.startSession();
// ํธ๋์ญ์
์ต์
์ค์
const transactionOptions = {
readPreference: "primary",
readConcern: { level: "local" },
writeConcern: { w: "majority" },
};
try {
await session.withTransaction(async () => {
const coll1 = client.db("mydb1").collection("foo");
const coll2 = client.db("mydb2").collection("bar");
// Important:: You must pass the session to the operations
await coll1.insertOne({ abc: 1 }, { session });
await coll2.insertOne({ xyz: 999 }, { session });
}, transactionOptions);
} finally {
// ์ธ์
์ข
๋ฃ
await session.endSession();
}
}
main();

์ฐธ์กฐ
https://rastalion.me/mongodb-lock-%EC%9E%A0%EA%B8%88/
https://www.mongodb.com/docs/manual/core/write-operations-atomicity/
https://www.mongodb.com/docs/manual/core/transactions/
https://stackoverflow.com/questions/51461952/mongodb-v4-0-transaction-mongoerror-transaction-numbers-are-only-allowed-on-a
https://www.mongodb.com/docs/manual/core/write-operations-atomicity/