Fox-id.org :: Komunitas FoxPro Indonesia

General Category => SQL Database => Topic started by: Foxpro.NET on April 13, 2009, 02:22:58 PM

Title: sintak MySql cek table sedang dikunci
Post by: Foxpro.NET on April 13, 2009, 02:22:58 PM
Dear,

di session A sy punya sintak spt ini :

Lock Tables tblBarang Write ;

nah yg jadi pertanyaan di session B, gmana cari tau bahwa table tblbarang sedang dikunci (tidak harus menunggu session A meng Unlock Tables)

Thanks
Title: Re: sintak MySql cek table sedang dikunci
Post by: taz on April 13, 2009, 04:38:42 PM
Saya ganti nanya : Buat apa mySQL tabel anda kunci?
pengunci tabel di mySQL bisa dilakukan. Namun buat apa? bukankah semua RDBMS didesain agar bisa menerima banyak thread secara bersamaan?
Title: Re: sintak MySql cek table sedang dikunci
Post by: Foxpro.NET on April 13, 2009, 05:00:41 PM
bentul mas taz, tp tuk kasus ini (closing bulanan) sy harus lock table
Title: Re: sintak MySql cek table sedang dikunci
Post by: arifinc on April 13, 2009, 05:24:11 PM
Pake teknik gak perlu dilock dong tablenya pak.
Misal lock periode systemnya
Title: Re: sintak MySql cek table sedang dikunci
Post by: fansul on April 14, 2009, 07:01:07 AM
bikin table periode create table periode (tahun varchar(4), bulan01 varchar(1), dst), waktu closing bulanan tinggal field bulannya di kasih tanda, sebelum insert/update/delete check dulu ke table periode sudah dilakukan closing belum
mungkin kira2 bisa di terima nggak ya
Title: Re: sintak MySql cek table sedang dikunci
Post by: davidmustakim on April 14, 2009, 08:07:42 AM
iya emang metode elegannya harus seperti @arifinc/@fansul, ... cuman @foxpro.NET terlanjur mau aman pake gembok+rante gede amat hehehe
Title: Re: sintak MySql cek table sedang dikunci
Post by: foxever_fox on April 14, 2009, 08:56:24 AM
Mungkin ada masalah konkurensi ,   
Seperti kasus pemesanan Tiket pesawat  , gara gara tabel nya ga di lock bisa bisa ada penumpang yg duduk ama pilot ..
Title: Re: sintak MySql cek table sedang dikunci
Post by: Foxpro.NET on April 14, 2009, 09:00:11 AM
gmana mo di lock pereiode systemnya, lah wong periode system tsb belum di closing kok di lock, user pasti teriak ("kok gak bisa input data kan belum diclosing"), setau sy setau saya loh yah lock periode system jika sudah terjadi proses closing....dan lagian klo just lock system periode user tetep bisa query data toh ? klo sy pake lock tables write ; query pun user gak bisa, cuman nyeng jd permasalahan.....session lain jika sebuah table dilock ada warning (tanpa nunggu diunlock)
Title: Re: sintak MySql cek table sedang dikunci
Post by: Foxpro.NET on April 14, 2009, 09:06:46 AM
usul temans juga sudah kepikiran, tp masak seh mysql yg katanya lebih canggih dari dbf harus main akal2an, sy hanya penasaran di dbf bisa dengan use nmdbf excl, user lain mau buka table tersebut tinggal tangkap errornya keluarin deh warningnya, masak mysql gak bisa,klo memang mysql bisa tuk apa pake akal2an GETHO LOOH...hehehhehehehe.....oh iyah klo ada kasus begini sy ada yg namanya rekalkuklasi(bukan closing)...bisa dari bulan 1 ampe bulan 12 terserah deh ampe bulan brp ajah, bagi sy merepotkan jika harus maen lock periode karena rekalkukasi dilakukan suka2 user.

Title: Re: sintak MySql cek table sedang dikunci
Post by: Foxpro.NET on April 14, 2009, 09:10:54 AM
eh kelupaan lagi........maksud sy pake lock.....user buat laporan pun tidak diperbolehkan, misal sy sedang proses rekalkukasi tuk HPP, mosok user bisa proses laporan HPP.......(ngerti gak yah ama bahasa gw yg amburadul heheheh) pokoke maksud lock di sini user lain gak bisa ngapa2in buka just insert/update/delete tp juga termasik query data.

Title: Re: sintak MySql cek table sedang dikunci
Post by: davidmustakim on April 14, 2009, 09:21:14 AM
hehehe saya setuju... terutama tentang tidak boleh buat laporan sementara system sedang proses tutup periode, setidaknya tidak boleh buat apa2 untuk periode itu input/maupun output... ya udah masalahnya bukan mysql kurang ini kurang itu... kayaknya kite2 ini yang maseh kurang tau kalee .. hihihi. 
Title: Re: sintak MySql cek table sedang dikunci
Post by: Foxpro.NET on April 14, 2009, 09:27:47 AM
om david......sebenernye tinggal dikit lagi neh problem solve nyak entuk saat table di lock oleh user A, user B yg mau buka table tersebut bisa langsung dapet warning "table sedang digembok!!" jadi user B gak harus nunggu table yg bersangkutan di unlock oleh user A.........iya klo prosesnya sebemtar klo prosesnya makan waktu wah user B nyangka PC nya Hang deh...padahal sedang Attemting to lock.....btw sy yaquiiin buangeet bisa pasti..cuman saya nya ajah neh yg masih cetek elmunya heheheheheheh
Title: Re: sintak MySql cek table sedang dikunci
Post by: davidmustakim on April 14, 2009, 09:34:49 AM
ya mungkin perlu dua field flag pada tabel periode: CLOSED dan CLOSING-IN-PROCESS (boso Bule yang terjemahannya = user dilarang teriak2 ) --- ato, warningnya barangkali bisa ditaruh di SP atau FUNCTION kalo perlu pake bantuan tabel ? semacam raise_application_error() di Oracle - lihat thread sebelah @fansul tentang "trigger validate"...ya akal2an sech, abis aye blom tau juga gimana maenkan/trigger warning mysql yang sesuai. Hehehe
Title: Re: sintak MySql cek table sedang dikunci
Post by: fansul on April 14, 2009, 09:42:02 AM
hal yang terjelek akan terjadi selama proses hpp dan komputer hang, dan closeing-in-prosess nggak bisa di kembalikan.
akibatanya semua user nggak bisa akses menu.
Title: Re: sintak MySql cek table sedang dikunci
Post by: Foxpro.NET on April 14, 2009, 09:42:30 AM
thanks om david, saya ubek2 dulu deh jeroannya mySql (PASTI BISA) hehehehehe........klo gak bisa juga DG (Derita Gue) deh....xixixixiixixixixix.....thanks all
Title: Re: sintak MySql cek table sedang dikunci
Post by: davidmustakim on April 14, 2009, 09:49:52 AM
@fansul: flag closing-in-process bisa berupa cursor temp aja kalo gitu... yang diset agar  hilang dengan sendirinya (bisa ga ya) bila proses berhenti karena selesai atau mental keluar misalnya karena manti lampu
Title: Re: sintak MySql cek table sedang dikunci
Post by: fansul on April 14, 2009, 10:36:06 AM
masak bisa sich cursor temp vfp, cursor temp kan hanya berlaku dikomputer itu ajak, kecuali cursor temp nya di server ya ? klu pakai jaringan internet bagaimana ya ? mungkin bisa pakai sp di mysql create cursor temp, selesai pakai di delete, klu komputer hang cursor temp akan terhapus dengan sendirian dengan jangka waktu tertentu. Bisa nggak ya ?
Title: Re: sintak MySql cek table sedang dikunci
Post by: davidmustakim on April 14, 2009, 10:55:31 AM
@fansul: la iya maksudku emang di server dan create pakai sp... kan mo kerja PR malam ini biar ga tanggung banyaknya gitu loh...
Title: Re: sintak MySql cek table sedang dikunci
Post by: davidmustakim on April 14, 2009, 04:28:51 PM
@foxpro.NET: sebenarnya lock tables bisa dihindari dengan menggunakan lock aplikasi get_lock() dan release_lock() yang kayaknya lebih aman tapi tidak terlalu restrictive. baca disini:
http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_get-lock
Amannya karena lock ini akan terlepas otomatis apabila client yang menglock terkeluar paksa.
Tapi itu berarti semua bagian aplikasi yang melakukan insert/update/delete dan pelaporan harus selalu terlebih dahulu melakukan check terhadap lock sebelum proceed.
untuk sekedar check apakah locking sedang berlangsung bisa pakai fungsi is_free_lock(namalock)
Title: Re: sintak MySql cek table sedang dikunci
Post by: Foxpro.NET on April 14, 2009, 04:43:12 PM
yup benar pak david denga function itu bisa, sy perjelas yah pertanyaan sy, gmana caranya mengetahui table "sedang di lock or tidak ?" bukan gmana cara lock table.....hehehehehhe

klo di foxpro kan tinggal bijini :

IF FLOCK()
    wait wind "lagi digembok tablenya"
ENDI

nah di mysql piye check table yg sedang dilock

btw thanks
Title: Re: sintak MySql cek table sedang dikunci
Post by: davidmustakim on April 14, 2009, 04:45:23 PM
lah... get_lock() itu bukan meng-lock table cuman menglock() nama dan ada return valuenya jadi kalau tidak dapat lock tidak bisa lanjut gitu loh -->  if flock() ~ if applikasi_lock / if get_lock(namalock)...  bedanya: ibaratnya klo kamu takut laptopmu di ruang kantor dibaca2 orang, tidak harus check apakah laptop udah dilock ... cukup juga kan cuman check pintu ruang kantornya udah di-lock. Kalau cuman untuk cek doang tidak meng-lock bisa pake is_free_lock(namalock)
-- ini setara ISFLOCKED() menghindari IF FLOCK() kalo niatnya cuman mau ngecheck
Title: Re: sintak MySql cek table sedang dikunci
Post by: davidmustakim on April 14, 2009, 04:49:35 PM
jadi "nama lock" itu kayak global variable di aplikasi kita
cuman ingat bahwa database juga mungkin diperlu oleh aplikasi lain misalnya hanya untuk tujuan referensi aja
jadi lock tables mungkin memang tidak bagus karena aplikasi lain itu tidak perduli closing periode di aplikasi yang sedang kita closing periode, itu sebabnya locking aplikasi ini metode yang lebih tepat karena menghindari pencekalan database, hanya pencekalan aplikasi kita terhadap database itu
Title: Re: sintak MySql cek table sedang dikunci
Post by: foxever_fox on April 14, 2009, 05:02:25 PM
mungkin kalo SELECT   ada error nya berarti di lock  ...

Do while .t.

hsl  =Sqlexec(handle,"Select xxxxxxx")
 if hsl=1
  exit   
 endif
 

if timeout
exit
endif


enddo
 

begitu ga ..
Title: Re: sintak MySql cek table sedang dikunci
Post by: Foxpro.NET on April 14, 2009, 05:15:57 PM
klo ada errornya mendingan bos, ini mah nunggu alias attemting to lock...sampe yg ngelock meng unlock table, kagak muncul error apa2
Title: Re: sintak MySql cek table sedang dikunci
Post by: davidmustakim on April 14, 2009, 05:18:29 PM
is_free_lock(namalock) langsung return 0 atau 1
Title: Re: sintak MySql cek table sedang dikunci
Post by: davidmustakim on April 14, 2009, 06:27:39 PM
........
Contoh konkrit-nya gini:

- pas sebelum modul closing periode dijalankan:
Quote
lcSql="SELECT GET_LOCK('tutupperiode',1)"
lnOk=SQLEXEC( nkoneksi, lcSql, 'ceklock' )
if lnOk>0
   if ceklock.get_lock__tutupperiode__ = 1
      ... lanjut eksekusi proses tutup periode
   else
      messagebox("aduuuh... koq bos udah duluin aku tutup periode ya, ciloko !")
   endif
endif

Dan Buat fungsi pada aplikasi VFP kita yang dipanggil oleh  tiap modul yang melakukan perubahan inset/update/delete atau apapun pada data, atau yang melakukan read tetapi berpotensi/tujuan membuat laporan cetak resmi. Untuk yang read sekedar browsing untuk cari info referensi / pembanding tentunya tidak perlu
Quote
lcSql="SELECT IS_FREE_LOCK('tutupperiode')"
lnOk=SQLEXEC( nkoneksi, lcSql, 'ceklock' )
if lnOk>0
   if ceklock.is_free_lock__tutupperiode__ = 1
      ... lanjut jalankan insert/update/delete atau modul laporan
   else
      ... messagebox("Sedang proses tutup periode, dilarang klewat serius kerja!)
   endif
endif

Solusi ini tidak lock tables (jadi mencegah ditanyain lagi kenapa oleh pak Taz  - hehehe )
MySql sendiri umumnya  'cenderung' menganjurkan subtitusi lock tables dengan methode diatas:
http://dev.mysql.com/doc/refman/5.0/en/lock-tables-notes.html
Title: Re: sintak MySql cek table sedang dikunci
Post by: foxever_fox on April 15, 2009, 08:44:55 AM
mmmm , kalo pake TimeOut gimana mas Yud  ............jika Querynya TimeOut berarti ke lock 

QueryTimeOut
Specifies the time to wait (in seconds) before returning a general time-out error. If you specify 0 (the default), the wait is indefinite and a time-out error is never returned. QueryTimeOut can be 0 to 600. Read/write.


 
Title: Re: sintak MySql cek table sedang dikunci
Post by: Foxpro.NET on April 15, 2009, 08:53:50 AM
iya neh, kayaknya tuk sementara pake time out deh, btw mySQL sintaknya select * from nmtbl timeout 1; ? dari maren error mulu neh query pake time out maklum masih cetek elmunya.........bijimane seh sintaknye ?
Title: Re: sintak MySql cek table sedang dikunci
Post by: foxever_fox on April 15, 2009, 09:52:32 AM
timeout adanya di SQLSETPROP