5 Contoh Program Menggunakan Session di MongoDB Dengan Python (Pymongo)
Implementasi transaksi pada aplikasi pemesanan maskapai penerbangan online. Dalam pemesanan kita perlu melakukan tiga operasi:
• Pemesanan tiket(seat_collection)
• Pembayaran (payment_collection)
• Update jumlah kursi dan penjualan yang dipesan (audit_collection)
Untuk aplikasi ini, menggunakan tiga koleksi terpisah, seperti yang dijelaskan diatas. Kode program ‘transaction_main.py’ digunakan untuk memperbarui koleksi yang terhubung dengan driver (Pymongo 3.7.1).
Buatlah program dengan pymongo untuk update dan melihat action saat menggunakan transaksi meliputi
• untuk menyimpan perubahan data dengan commit
• untuk menghapus perubahan data dengan abortTransaction
• untuk transaksi tanpa write konflik dapat dilakukan
• transaksi dengan write konflik dibatalkan
Persiapan Server :
A. Persiapan Server Menggunakan Windows:
1. Pastikan mongodb telah terinstall pada komputer. Disarankan untuk install versi 4.02. Install python 3.71 dan tambahkan path pada system variabel windows.
C:\Users\Anam\AppData\Local\Programs\Python\Python371-32\Scripts\;
C:\Users\Anam\AppData\Local\Programs\Python\Python371-32\;
3. Install pymongo dengan pip disarankan pymongo 3.71
Syntaks : pip install pymongo / pip install –upgrade pymongo
4. Install mtools dengan pip .
Syntaks : pip install mtools
MTools adalah kumpulan skrip pembantu untuk mengurai, menyaring, dan memvisualisasikan file log MongoDB (mongod, mongos). mtools juga termasuk mlaunch, utilitas untuk dengan cepat mengatur lingkungan pengujian MongoDB yang kompleks pada mesin lokal. Untuk demo ini kita hanya akan menggunakan program mlaunch.
5. Install psutil dengan pip. Psutils dibutuhkan sebagai pendukung mtools.
Sysntaks : pip install psutil
Psutil merupakan modul yang menyediakan sebuah interface untuk mengambil informasi tentang proses yang berjalan dan sistem utilitas secara portable dengan menggunakan python, menerapkan banyak fungsi yang ditawarkan oleh tools ( mtools).
6. Install virtualenv untuk virtualisasi environment
7. Buka command prompt di tempat projeck berada. Kemudian jalankan 2 perintah berikut.
Sysntaks : virtualenv env
env\Scripts\activate.bat
Virtualenv membuat lingkungan python virtual yang terisolasi,sehinggga program Python yang berjalan di dalam virtualenv memiliki modul-modulnya sendiri, sehingga dapat menghindari bentrokan antar library dan program dari luar tidak bisa mengaksesnya. Misal, kita mempunyai dua proyek python, yang satu menggunakan Library X1.6 dan satu lagi menggunakan Library X1.9 , hal ini memerlukan virtual environment agar dua proyek ini dapat berjalan bersamaan pada satu mesin.
8. Jalankan server dengan mlaunch. Ketika perintah ini dijalankan maka otomatis akan tercipta 3 server. Dengan port 27100, 27101, 27102 dan men set primary dan secondary secara otomatis.
Mlaunch adalah skrip untuk dapat melakukan pengujian local environment secara cepat termasuk dalam set replica dan sistem yang sharded.
9. Masih di lanjutan dari menjalankan server. Jalankan program transaction_main.py. program ini akan mengenerate daftar secara otomatis.
Syntak : python transaction_main.py
10. Untuk melihat perubahan secara live pada daftar collection seat dapat menggunakan watch_transaction.py. (catatan transaction_main.py harus berjalan)
Syntaks: python watch_transactions.py --database SEATSDB --collection seats
11. Untuk melihat perubahan secara live pada daftar collection payment dapat menggunakan watch_transaction.py. (catatan transaction_main.py harus berjalan)
Syntaks: python watch_transactions.py --database PAYMENTSDB --collection payments
12. Data base yang terbentuk pada server antara lain : AUDITDB, PAYMENTSDB, SEATSDB
13. Isi masing-masing database sebagai berikut :
B. Persiapan Server Menggunakan Linux(Ubuntu 16 64 bit)
1. Menginstall mongoDB versi 4 pada server ubuntu2. Mengecek apakah mongoDB sudah dapat dijalankan dengan menjalankan perintah mongo.
3. Menginstall pip yang nantinya akan digunakan untuk menginstall paket python lainnya. Berbeda dengan windows yang pip sudah terbawa langsung dengan pythonnya. Di linux pip harus diinstall secara terpisah.
4. Menginstall dan mengupgrade pymongo. Pymongo adalah antarmuka antara python dan mongoDB (API). Agar perintah di mongo dapat dikenali didalam python.
5. Selanjutnya menginstall mtools menggunakan pip.
6. Paket selanjutnya yang diinstall adalah pseutil.
7. Selanjutnya adalah menginstall virtualenv. Virtualenv berfungsi untuk membuat virtual environment.
8. Setelah semua paket yang dibutuhkan terinstal buat folder di :/root/ dengan perintah mkdir pymongo-transactions. Folder ini akan kita gunakan menyimpan file-file project.
9. Selanjutnya adalah copy atau upload file transaction_main.py dan program 1 sampai 4 yang telah dibuat ke dalam server.
10. Masih dari dalam folder /root/pymongo_transaction jalankan virtual environmet. Dengan perintah : source venv/bin/activate
11. Selanjutnya adalah menjalankan server mongo db pada port 27100, 27101 dan 27102 menggunaan perintah : mlaunch init --port 27100 --replicaset --name "txntest"
Perintah tersebut otomatis membuat 3 buath server dengan settingan replica setnya.
12. Berikutnya jalankan program transaction_main.py untuk memulai mengenerate database SEATSDB, PAYMENTSDB dan AUDITDB. Dengan menggunakan perintah : python transaction_main.py
Hasil Running Program dan Analisa :
A. Program untuk menyimpan perubahan data dengan commit
Sourcecode Program :Hasil Running Program :
Di windows :
Di Linux
Analisa Program :
Program diatas berfungsi untuk menambahkan data seat 7A pada collection seats pada database SEATSDB dan collection payments pada database PAYMENTSDB. Dengan melakukan commit pada sesi.
#import library yang dibutuhkan
from argparse import ArgumentParser
import datetime
import time
import sys
import random
import pymongo
import pymongo.errors
from pymongo import MongoClient
import urllib.parse
Analisa : pertama adalah import librari yang akan digunakan didalam program
#membuat koneksi ke mongo DB
parser = ArgumentParser()
parser.add_argument("--host", default="mongodb://localhost:27100,localhost:27101,localhost:27102/?replicaSet=txntest&retryWrites=true",
help="MongoDB URI [default: %(default)s]")
parser.add_argument("--usetxns", default=False, action="store_true", help="Use transactions [default: %(default)s]")
parser.add_argument("--delay", default=1.0, type=float,
help="Delay between two insertion events [default: %(default)s]")
parser.add_argument("--iterations", default=0, type=int, help="Run N iterations. O means run forever")
parser.add_argument("--randdelay", type=float, nargs=2,
help="Create a delay set randomly between the two bounds [default: %(default)s]")
args = parser.parse_args()
Analisa : setelah import library selanjutnya adalah membuat koneksi mongo DB. Terdapat 3 server localhost dengan port 27100, 27101, dan 27101
client = pymongo.MongoClient(host=args.host)
seatsdb = client["SEATSDB"]
paymentsdb = client["PAYMENTSDB"]
auditdb = client[ "AUDITDB"]
payments_collection = paymentsdb["payments"]
seats_collection = seatsdb["seats"]
audit_collection = auditdb["audit"]
Analisa : setelah terkoneksi dengan server selanjutnya mengkoneksikan ke database SEATSDB, PAYMENTSDB, DAN AUDITDB.
x = seats_collection.count()
Analisa : membuat variable x untuk menghitung jumlah dokumen dalam collection seat
audit_collection.update_one({ "audit" : "seats"}, {"$set":{"count" : x}})
Analisa : membuat update isi database audit
price = random.randrange(200, 500, 10)
Analisa : membuat perintah untuk mengacak isi price
session1 = client.start_session()
Analisa : membuat session 1
session1.start_transaction()
Analisa : memulai session 1
#fungsi insert (one / many)
seats_collection.insert_one({"flight_no":"Anam", "seat":"7A", "date" : datetime.datetime.utcnow()}, session=session1)
payments_collection.insert_one({"flight_no":"Anam", "seat":"7A", "date" : datetime.datetime.utcnow(), "price" : price}, session=session1)
Analisa : melakukan insert seat 7A ke collection seats dan payments dengan menggunakan sesi 1
print ("============================================ ")
print ("DAFTAR SEATSDB SEBELUM COMMIT")
for x in seats_collection.find().sort("seat",1):
print(x)
print ("============================================ ")
print ("DAFTAR PAYMENTSDB SEBELUM COMMIT")
for x in payments_collection.find().sort("seat",1):
print(x)
print ("============================================ ")
print ("DAFTAR AUDITDB SEBELUM COMMIT")
for x in audit_collection.find():
print(x)
print ("============================================ ")
Analisa : menampilkan isi collection seats, payments dan audit sebelum sesi di commit.
#commit / abort sesi
session1.commit_transaction()
Analisa : melakukan commit session1 dan menyimpan hasil transaksi.
x = seats_collection.count()
audit_collection.update_one({ "audit" : "seats"}, {"$set":{"count" : x}})
Analisa : melakukan update x untuk menghitung jumlah dokumen seats dan melakukan update pada collection audit.
print ("============================================ ")
print ("DAFTAR SEATSDB")
for x in seats_collection.find().sort("seat",1):
print(x)
#cara 2 : print ("data : %s" % x)
print ("============================================ ")
print ("DAFTAR PAYMENTSDB")
for x in payments_collection.find().sort("seat",1):
print(x)
print ("============================================ ")
print ("DAFTAR AUDITDB")
for x in audit_collection.find():
print(x)
Analisa : menampilkan isi collection seats , payments dan audit setelah melakukan transaksi.
B. Program untuk menghapus perubahan data dengan abortTransaction
Sourcecode Program :Hasil Running Program :
Di Windows :
Di Linux:
Analisa Program :
Program diatas berfungsi untuk menambahkan data seat 7A pada collection seats pada database SEATSDB dan collection payments pada database PAYMENTSDB. Kemudian program menampilkan isi database ketika terjadi transaksi sebelum dicommit. Perbedaan dengan program nomor 1 adalah bahwa pada program nomor 1 transaksi di commit sehingga perubahan tersimpan. Sedangkan pada program 2 ini transaksi tidak di commit sehingga perubahan tidak disimpan. Dapat dilihat database sebelum diabort dan sesudah di abort tidak mengalami perubahan.
#import library yang dibutuhkan
from argparse import ArgumentParser
import datetime
import time
import sys
import random
import pymongo
import pymongo.errors
from pymongo import MongoClient
import urllib.parse
Analisa : pertama adalah import librari yang akan digunakan didalam program
#membuat koneksi ke mongo DB
parser = ArgumentParser()
parser.add_argument("--host", default="mongodb://localhost:27100,localhost:27101,localhost:27102/?replicaSet=txntest&retryWrites=true",
help="MongoDB URI [default: %(default)s]")
parser.add_argument("--usetxns", default=False, action="store_true", help="Use transactions [default: %(default)s]")
parser.add_argument("--delay", default=1.0, type=float,
help="Delay between two insertion events [default: %(default)s]")
parser.add_argument("--iterations", default=0, type=int, help="Run N iterations. O means run forever")
parser.add_argument("--randdelay", type=float, nargs=2,
help="Create a delay set randomly between the two bounds [default: %(default)s]")
args = parser.parse_args()
Analisa : setelah import library selanjutnya adalah membuat koneksi mongo DB. Terdapat 3 server localhost dengan port 27100, 27101, dan 27101
client = pymongo.MongoClient(host=args.host)
seatsdb = client["SEATSDB"]
paymentsdb = client["PAYMENTSDB"]
auditdb = client[ "AUDITDB"]
payments_collection = paymentsdb["payments"]
seats_collection = seatsdb["seats"]
audit_collection = auditdb["audit"]
Analisa : setelah terkoneksi dengan server selanjutnya mengkoneksikan ke database SEATSDB, PAYMENTSDB, DAN AUDITDB.
x = seats_collection.count()
Analisa : membuat variable x untuk menghitung jumlah dokumen dalam collection seat
audit_collection.update_one({ "audit" : "seats"}, {"$set":{"count" : x}})
Analisa : membuat update isi database audit
price = random.randrange(200, 500, 10)
Analisa : membuat perintah untuk mengacak isi price
session1 = client.start_session()
Analisa : membuat session 1
session1.start_transaction()
Analisa : memulai session 1
#fungsi insert (one / many)
seats_collection.insert_one({"flight_no":"Anam", "seat":"8A", "date" : datetime.datetime.utcnow()}, session=session1)
payments_collection.insert_one({"flight_no":"Anam", "seat":"8A", "date" : datetime.datetime.utcnow(), "price" : price}, session=session1)
Analisa : melakukan insert seat 8A ke collection seats dan payments dengan menggunakan sesi 1
print ("============================================ ")
print ("DAFTAR SEATSDB SEBELUM COMMIT")
for x in seats_collection.find().sort("seat",1):
print(x)
print ("============================================ ")
print ("DAFTAR PAYMENTSDB SEBELUM COMMIT")
for x in payments_collection.find().sort("seat",1):
print(x)
print ("============================================ ")
print ("DAFTAR AUDITDB SEBELUM COMMIT")
for x in audit_collection.find():
print(x)
print ("============================================ ")
Analisa : menampilkan isi collection seats, payments dan audit sebelum sesi di commit.
#commit / abort sesi
session1.abort_transaction()
Analisa : melakukan abort session1 dan mengagalkan penyimpanan transaksi.
x = seats_collection.count()
audit_collection.update_one({ "audit" : "seats"}, {"$set":{"count" : x}})
Analisa : melakukan update x untuk menghitung jumlah dokumen seats dan melakukan update pada collection audit.
print ("============================================ ")
print ("DAFTAR SEATSDB")
for x in seats_collection.find().sort("seat",1):
print(x)
#cara 2 : print ("data : %s" % x)
print ("============================================ ")
print ("DAFTAR PAYMENTSDB")
for x in payments_collection.find().sort("seat",1):
print(x)
print ("============================================ ")
print ("DAFTAR AUDITDB")
for x in audit_collection.find():
print(x)
Analisa : menampilkan isi collection seats , payments dan audit setelah melakukan transaksi.
C. Program untuk transaksi tanpa write konflik dapat dilakukan
Sourcecode Program :Hasil Running Program :
Di Windows :
Di Linux:
Analisa Program :
Program diatas berfungsi untuk menambahkan data seat 9A dan seat 10A pada collection seats pada database SEATSDB dan collection payments pada database PAYMENTSDB. Serta mengupdate collection audit sesuai jumlah collection setelah ditambahkan. Penambahan collection dibagi menjadi 2 sesi yang berjalan bersamaan. Namun tidak ada write conflik diantara keduanya.
#import library yang dibutuhkan
from argparse import ArgumentParser
import datetime
import time
import sys
import random
import pymongo
import pymongo.errors
from pymongo import MongoClient
import urllib.parse
Analisa : pertama adalah import librari yang akan digunakan didalam program
#membuat koneksi ke mongo DB
parser = ArgumentParser()
parser.add_argument("--host", default="mongodb://localhost:27100,localhost:27101,localhost:27102/?replicaSet=txntest&retryWrites=true",
help="MongoDB URI [default: %(default)s]")
parser.add_argument("--usetxns", default=False, action="store_true", help="Use transactions [default: %(default)s]")
parser.add_argument("--delay", default=1.0, type=float,
help="Delay between two insertion events [default: %(default)s]")
parser.add_argument("--iterations", default=0, type=int, help="Run N iterations. O means run forever")
parser.add_argument("--randdelay", type=float, nargs=2,
help="Create a delay set randomly between the two bounds [default: %(default)s]")
args = parser.parse_args()
Analisa : setelah import library selanjutnya adalah membuat koneksi mongo DB. Terdapat 3 server localhost dengan port 27100, 27101, dan 27101
client = pymongo.MongoClient(host=args.host)
seatsdb = client["SEATSDB"]
paymentsdb = client["PAYMENTSDB"]
auditdb = client[ "AUDITDB"]
payments_collection = paymentsdb["payments"]
seats_collection = seatsdb["seats"]
audit_collection = auditdb["audit"]
Analisa : setelah terkoneksi dengan server selanjutnya mengkoneksikan ke database SEATSDB, PAYMENTSDB, DAN AUDITDB.
x = seats_collection.count()
Analisa : membuat variable x untuk menghitung jumlah dokumen dalam collection seat
audit_collection.update_one({ "audit" : "seats"}, {"$set":{"count" : x}})
Analisa : membuat update isi database audit
price = random.randrange(200, 500, 10)
Analisa : membuat perintah untuk mengacak isi price
session1 = client.start_session()
session2 = client.start_session()
Analisa : membuat session 1 dan session 2
session1.start_transaction()
session2.start_transaction()
Analisa : memulai transaksi pada session 1 dan session 2
#fungsi insert (one / many)
seats_collection.insert_one({"flight_no":"Anam", "seat":"9A", "date" : datetime.datetime.utcnow()}, session=session1)
payments_collection.insert_one({"flight_no":"Anam", "seat":"9A", "date" : datetime.datetime.utcnow(), "price" : price}, session=session1)
seats_collection.insert_one({"flight_no":"Anam", "seat":"10A", "date" : datetime.datetime.utcnow()}, session=session2)
payments_collection.insert_one({"flight_no":"Anam", "seat":"10A", "date" : datetime.datetime.utcnow(), "price" : price}, session=session2)
Analisa : melakukan insert seat 9A ke collection seats dan payments dengan menggunakan sesi 1 dan melakukan insert seat 10A ke collection seats dan payments dengan menggunakan sesi 2.
print ("============================================ ")
print ("DAFTAR SEATSDB SEBELUM COMMIT")
for x in seats_collection.find().sort("seat",1):
print(x)
print ("============================================ ")
print ("DAFTAR PAYMENTSDB SEBELUM COMMIT")
for x in payments_collection.find().sort("seat",1):
print(x)
print ("============================================ ")
print ("DAFTAR AUDITDB SEBELUM COMMIT")
for x in audit_collection.find():
print(x)
print ("============================================ ")
Analisa : menampilkan isi collection seats, payments dan audit sebelum sesi di commit.
#commit / abort sesi
session1.commit_transaction()
session2.commit_transaction()
Analisa : melakukan commit session1 dan session2 sehingga transaksi menjadi tersimpan.
x = seats_collection.count()
audit_collection.update_one({ "audit" : "seats"}, {"$set":{"count" : x}})
Analisa : melakukan update x untuk menghitung jumlah dokumen seats dan melakukan update pada collection audit.
print ("============================================ ")
print ("DAFTAR SEATSDB")
for x in seats_collection.find().sort("seat",1):
print(x)
#cara 2 : print ("data : %s" % x)
print ("============================================ ")
print ("DAFTAR PAYMENTSDB")
for x in payments_collection.find().sort("seat",1):
print(x)
print ("============================================ ")
print ("DAFTAR AUDITDB")
for x in audit_collection.find():
print(x)
Analisa : menampilkan isi collection seats , payments dan audit setelah melakukan transaksi.
D. Program transaksi dengan write konflik dibatalkan
Sourcecode Program :Hasil Running Program :
Di Windows :
Di Linux:
Analisa Program :
Program diatas berfungsi untuk menghapus data seat 3A pada collection seats pada database SEATSDB dan collection payments pada database PAYMENTSDB. Serta mengupdate collection audit sesuai jumlah collection setelah ditambahkan. Namun didalam program seat 3 A di hapus 2X pada session yang berbeda sehingga terjadi write conflik dan program mengalami error. Atau dibatalkan.
Analisa : menampilkan isi collection seats , payments dan audit setelah melakukan transaksi.#import library yang dibutuhkan
from argparse import ArgumentParser
import datetime
import time
import sys
import random
import pymongo
import pymongo.errors
from pymongo import MongoClient
import urllib.parse
Analisa : pertama adalah import librari yang akan digunakan didalam program
#membuat koneksi ke mongo DB
parser = ArgumentParser()
parser.add_argument("--host", default="mongodb://localhost:27100,localhost:27101,localhost:27102/?replicaSet=txntest&retryWrites=true",
help="MongoDB URI [default: %(default)s]")
parser.add_argument("--usetxns", default=False, action="store_true", help="Use transactions [default: %(default)s]")
parser.add_argument("--delay", default=1.0, type=float,
help="Delay between two insertion events [default: %(default)s]")
parser.add_argument("--iterations", default=0, type=int, help="Run N iterations. O means run forever")
parser.add_argument("--randdelay", type=float, nargs=2,
help="Create a delay set randomly between the two bounds [default: %(default)s]")
args = parser.parse_args()
Analisa : setelah import library selanjutnya adalah membuat koneksi mongo DB. Terdapat 3 server localhost dengan port 27100, 27101, dan 27101
client = pymongo.MongoClient(host=args.host)
seatsdb = client["SEATSDB"]
paymentsdb = client["PAYMENTSDB"]
auditdb = client[ "AUDITDB"]
payments_collection = paymentsdb["payments"]
seats_collection = seatsdb["seats"]
audit_collection = auditdb["audit"]
Analisa : setelah terkoneksi dengan server selanjutnya mengkoneksikan ke database SEATSDB, PAYMENTSDB, DAN AUDITDB.
x = seats_collection.count()
Analisa : membuat variable x untuk menghitung jumlah dokumen dalam collection seat
audit_collection.update_one({ "audit" : "seats"}, {"$set":{"count" : x}})
Analisa : membuat update isi database audit
price = random.randrange(200, 500, 10)
Analisa : membuat perintah untuk mengacak isi price
session1 = client.start_session()
session2 = client.start_session()
Analisa : membuat session 1 dan session 2
session1.start_transaction()
session2.start_transaction()
Analisa : memulai transaksi pada session 1 dan session 2
seats_collection.delete_many({"seat":"3A"}, session=session1)
payments_collection.delete_one({"seat":"3A"}, session=session1)
seats_collection.delete_many({"seat":"3A"}, session=session2)
payments_collection.delete_one({"seat":"3A"}, session=session2)
Analisa : melakukan delete seat 3A ke collection seats dan payments dengan menggunakan sesi 1 dan melakukan delete seat 3A ke collection seats dan payments dengan menggunakan sesi 2. Terjadi write conflik karena menghapus 1 dokumen sebanyak 2 x.
print ("============================================ ")
print ("DAFTAR SEATSDB SEBELUM COMMIT")
for x in seats_collection.find().sort("seat",1):
print(x)
print ("============================================ ")
print ("DAFTAR PAYMENTSDB SEBELUM COMMIT")
for x in payments_collection.find().sort("seat",1):
print(x)
print ("============================================ ")
print ("DAFTAR AUDITDB SEBELUM COMMIT")
for x in audit_collection.find():
print(x)
print ("============================================ ")
Analisa : menampilkan isi collection seats, payments dan audit sebelum sesi di commit. Dibatalkan otomatis karena terjadi write conflik.
#commit / abort sesi
session1.commit_transaction()
session2.commit_transaction()
Analisa : melakukan commit session1 dan session2 sehingga transaksi menjadi tersimpan. Dibatalkan otomatis karena terjadi write conflik.
x = seats_collection.count()
audit_collection.update_one({ "audit" : "seats"}, {"$set":{"count" : x}})
Analisa : melakukan update x untuk menghitung jumlah dokumen seats dan melakukan update pada collection audit. Dibatalkan otomatis karena terjadi write conflik.
print ("============================================ ")
print ("DAFTAR SEATSDB")
for x in seats_collection.find().sort("seat",1):
print(x)
#cara 2 : print ("data : %s" % x)
print ("============================================ ")
print ("DAFTAR PAYMENTSDB")
for x in payments_collection.find().sort("seat",1):
print(x)
print ("============================================ ")
print ("DAFTAR AUDITDB")
for x in audit_collection.find():
print(x)
Analisa : menampilkan isi collection seats , payments dan audit setelah melakukan transaksi. Dibatalkan otomatis karena terjadi write conflik.
Perbaikan Soal 3 :
Kasus : Pembatalan Insert Seat jika nomor seats telah ditemukan !.
Sourcecode Program :Hasil Running Program :
Di Windows :
Analisa Program :
Program diatas berfungsi untuk menambahkan data seat 1A pada collection seats pada database SEATSDB dan collection payments pada database PAYMENTSDB. Serta mengupdate collection audit sesuai jumlah collection setelah ditambahkan. Jika seat 1 A telah ada di database maka transaksi akan dibatalkan (abort_commit) tapi jika seat 1A belum terdapat di database maka seat 1A dapat ditambahkan.
#import library yang dibutuhkan
from argparse import ArgumentParser
import datetime
import time
import sys
import random
import pymongo
import pymongo.errors
from pymongo import MongoClient
import urllib.parse
Analisa : pertama adalah import librari yang akan digunakan didalam program
#membuat koneksi ke mongo DB
parser = ArgumentParser()
parser.add_argument("--host", default="mongodb://localhost:27100,localhost:27101,localhost:27102/?replicaSet=txntest&retryWrites=true",
help="MongoDB URI [default: %(default)s]")
parser.add_argument("--usetxns", default=False, action="store_true", help="Use transactions [default: %(default)s]")
parser.add_argument("--delay", default=1.0, type=float,
help="Delay between two insertion events [default: %(default)s]")
parser.add_argument("--iterations", default=0, type=int, help="Run N iterations. O means run forever")
parser.add_argument("--randdelay", type=float, nargs=2,
help="Create a delay set randomly between the two bounds [default: %(default)s]")
args = parser.parse_args()
Analisa : setelah import library selanjutnya adalah membuat koneksi mongo DB. Terdapat 3 server localhost dengan port 27100, 27101, dan 27101
client = pymongo.MongoClient(host=args.host)
seatsdb = client["SEATSDB"]
paymentsdb = client["PAYMENTSDB"]
auditdb = client[ "AUDITDB"]
payments_collection = paymentsdb["payments"]
seats_collection = seatsdb["seats"]
audit_collection = auditdb["audit"]
Analisa : setelah terkoneksi dengan server selanjutnya mengkoneksikan ke database SEATSDB, PAYMENTSDB, DAN AUDITDB.
x = seats_collection.count()
Analisa : membuat variable x untuk menghitung jumlah dokumen dalam collection seat
audit_collection.update_one({ "audit" : "seats"}, {"$set":{"count" : x}})
Analisa : membuat update isi database audit
price = random.randrange(200, 500, 10)
Analisa : membuat perintah untuk mengacak isi price
seatno = "1A"
flightno = "EI178"
Analisa : membuat variabel yang akan menyimpan memuat data seat dan flight yang akan di tambahkan.
session1 = client.start_session()
Analisa : membuat session 1
session1.start_transaction()
Analisa : memulai session 1
#fungsi insert (one / many)
seats_collection.insert_one({"flight_no":" flightno ", "seat":"seatno", "date" : datetime.datetime.utcnow()}, session=session1)
payments_collection.insert_one({"flight_no":" flightno ", "seat":"seatno", "date" : datetime.datetime.utcnow(), "price" : price}, session=session1)
Analisa : melakukan insert nilai variabel seatno dan flightno ke collection seats dan payments dengan menggunakan sesi 1
print ("============================================ ")
print ("DAFTAR SEATSDB SEBELUM COMMIT")
for x in seats_collection.find().sort("seat",1):
print(x)
print ("============================================ ")
print ("DAFTAR PAYMENTSDB SEBELUM COMMIT")
for x in payments_collection.find().sort("seat",1):
print(x)
print ("============================================ ")
print ("DAFTAR AUDITDB SEBELUM COMMIT")
for x in audit_collection.find():
print(x)
print ("============================================ ")
Analisa : menampilkan isi collection seats, payments dan audit sebelum sesi di commit.
#seleksi kondisi jika seat telah ada maka transaksi dibatalkan.
y = seats_collection.count({"seat":seatno, "flight_no":flightno})
if y>0:
session1.abort_transaction()
print(" ")
print ("==============================================================" )
print ("TRANSAKSI DIBATALKAN KARENA SEAT : ",seatno," SUDAH DIPESAN!!!!" )
print ("==============================================================" )
print(" ")
else:
session1.commit_transaction()
print(" ")
print ("==============================================================" )
print ("SEAT TELAH DITAMBAHKAN" )
print ("==============================================================" )
print(" ")
Analisa : seleksi kondisi untuk menentukan apakan transaksi dapat disimpan atau tidak. Dalam contoh hasil program diatas telah terdapat data seat 1 A. Jadi ketika program dijalankan program menghitung jumlah seat 1A dan hasilnya tidaklah 0. Maka transaksi akan dibatalkan.
x = seats_collection.count()
audit_collection.update_one({ "audit" : "seats"}, {"$set":{"count" : x}})
Analisa : melakukan update x untuk menghitung jumlah dokumen seats dan melakukan update pada collection audit.
print ("============================================ ")
print ("DAFTAR SEATSDB")
for x in seats_collection.find().sort("seat",1):
print(x)
#cara 2 : print ("data : %s" % x)
print ("============================================ ")
print ("DAFTAR PAYMENTSDB")
for x in payments_collection.find().sort("seat",1):
print(x)
print ("============================================ ")
print ("DAFTAR AUDITDB")
for x in audit_collection.find():
print(x)
Analisa : menampilkan isi collection seats , payments dan audit setelah melakukan transaksi.
Kesimpulan :
• MongoDB mendukung berbagai bahasa pemrograman: RUBY, PYTHON, JAVA, C ++, PHP, C#.• Pymongo Adalah library yang menjembatani MongoDB dan Python. sehingga perintah-perintah dalam mongoDB dapat di tranlasikan dalam python.
• Di dalam mongoDB dapat dibuat banyak sesi sekaligus. Untuk memulai transaksi harus dimulai dengan start_transaction() dan untuk menyimpan hasil transaksi dapat menggunakan commit_transaction() sedangkang untuk mendiscard hasil transaksi dapat dengan abort_transaction().
• Sesi-sesi yang diciptakan dalam mongoDB dapat melakukan read dan write secara bersamaan tanpa mengganggu satu sama lain.
• Apabila terdapat 2 sesi yang memiliki write konflik. Misal menghapus 1 objek yang sama. Maka transaksi akan otomatis dibatalkan.
Referensi :
• http://api.mongodb.com/python/current/api/pymongo/client_session.html• http://api.mongodb.com/python/current/api/pymongo/client_session.html#pymongo.client_session.ClientSession.start_transaction
• http://api.mongodb.com/python/current/api/pymongo/client_session.html#pymongo.client_session.TransactionOptions
• http://api.mongodb.com/python/current/api/pymongo/database.html
• http://api.mongodb.com/python/current/api/pymongo/read_concern.html#pymongo.read_concern.ReadConcern
• http://api.mongodb.com/python/current/api/pymongo/write_concern.html
• http://api.mongodb.com/python/current/api/pymongo/write_concern.html#pymongo.write_concern.WriteConcern
• http://api.mongodb.com/python/current/api/pymongo/write_concern.html#pymongo.write_concern.WriteConcern
• http://api.mongodb.com/python/current/tutorial.html#getting-a-database
• http://www.w3big.com/id/mongodb/mongodb-replication.html
• https://askubuntu.com/questions/766131/set-static-ip-ubuntu
• https://docs.mongodb.com/manual/installation/
• https://docs.mongodb.com/manual/reference/read-concern/#read-concern-levels
• https://docs.mongodb.com/manual/reference/write-concern/
• https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/
• https://docs.mongodb.com/master/core/transactions/?_ga=2.5877171.1029531569.1543461561-206042806.1536800450
• https://dzone.com/articles/mongodb-transactions-your-very-first-transaction-w
• https://dzone.com/articles/multi-document-transactions-on-mongodb-40
• https://github.com/jdrumgoole/pymongo-transactions
• https://linuxize.com/post/how-to-install-pip-on-ubuntu-18.04/
• https://programwithus.com/learn-to-code/Pip-and-virtualenv-on-Windows/
• https://servernesia.com/2977/cara-install-python-linux/
• https://solarianprogrammer.com/2017/06/30/building-python-ubuntu-wsl-debian/
• https://stackoverflow.com/questions/45072617/default-values-of-path-variables-in-windows-10
• https://stackoverflow.com/questions/51705212/how-to-get-a-database-and-collection-from-mongodb-clientsession
• https://www.mongodb.com/blog/post/introduction-to-mongodb-transactions-in-python
• https://www.mongodb.com/transactions
• https://www.petanikode.com/python-list/
• https://www.tecmint.com/command-line-web-browsers/