Author Topic: Deadlock MySQL 5.7  (Read 3117 times)

0 Members and 1 Guest are viewing this topic.

Offline benqz

  • Junior Member
  • *
  • Posts: 139
Deadlock MySQL 5.7
« on: June 20, 2017, 03:00:37 PM »
Dear para master, ada yang pernah menemui kondisi deadlock pada mySQL 5.7?

Saya punya perintah seperti ini:

LOCK TABLES faktur WRITE;
UPDATE faktur SET ...
UNLOCK TABLES;

Perintah diatas tidak ada masalah untuk mySQL 5.1 bahkan untuk user yang banyak, ketika membuat server baru under linux ubuntu server dengan mySQL 5.7 disini mulai timbul masalah ketika di running dengan banyak user dan transaksi ribuan mulai terjadi deadlock2.

Kalau rekan2 punya tips dan trik untuk mengatasi ini tolong di share ya...

Regards.

Offline foxy

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 3.605
    • Foxy Land
Re: Deadlock MySQL 5.7
« Reply #1 on: June 21, 2017, 02:23:39 PM »
waduhh... heavy stuff..... saya gak tau kalau MySQL. Apalagi masalah "jalan di versi ini, gak jalan di versi lain".

Good luck pak benqz.....  :icon_salut:

foxy
This post is provided as is. Feel free to use all the codes and information, however understand that I don't have any obligations to fix any bug(s) or follow up this subject.

Offline poison

  • Hero Member
  • *
  • Posts: 1.631
  • Poison 4 Women
Re: Deadlock MySQL 5.7
« Reply #2 on: June 22, 2017, 07:01:53 AM »
waduhh... heavy stuff..... saya gak tau kalau MySQL. Apalagi masalah "jalan di versi ini, gak jalan di versi lain".

Good luck pak benqz.....  :icon_salut:

foxy
waaaaaaaaaaaah....apalagi saya, MySQL-nya ...apalagi perintah "LOCK TABLES"-nya, seumur-umur belum pernah make.....
(mungkin saya salah satu yang paling bandel.... :icon_biggrin:)
think BIG to get BIG thing

Offline hell_angel

  • Junior Member
  • *
  • Posts: 316
Re: Deadlock MySQL 5.7
« Reply #3 on: July 05, 2017, 12:32:47 PM »
kalau saran saya kenapa ga pake transaction saja, (mudah"an ga ada pa dm, he hehe). lock sama transaction itu macam dos sama windows (di dos perintah kebanyakan di ketik, terkesan sulit krn hrs dihapalkan) sedangkan di windows kita banyak menggunakan click and drag (kesannya lebih user friendly); perumpamaan lain, pilihan antara pemrograman 2d/3d langsung melalui card vga (manual sekali, dan krn graphic card beda" design, maka pasti kebayang sulitnya, krn harus menyesuaikan graphic card masing" merk), atau menggunakan directx API yang pasti lebih comfort. walaupun tidak semua hal yang baru itu lebih bagus dari sesuatu yang lama, tapi kebanyakan sesuatu/fasilitas yang baru itu pasti di kembangkan krn tujuannya pekerjaan biar lebih gampang kan?, jaman dan waktu terus berubah, kita juga harus berubah. my opinion sih.


regard,


ha
A man who can moves a mountain, begins by carrying a small stone....

Offline benqz

  • Junior Member
  • *
  • Posts: 139
Re: Deadlock MySQL 5.7
« Reply #4 on: July 13, 2017, 09:56:18 AM »
Tq responnya pak ha, penggunaan LOCK disini berbeda fungsi dengan transaction. Fungsinya untuk mengunci pembacaan dan penulisan terkait nomor faktur yang bersifat counter supaya tidak terjadi overwrite untuk user yang berbeda. Saya masih trial n error sebulan ini di tempat customer moga2 berjalan lancar.

Offline hell_angel

  • Junior Member
  • *
  • Posts: 316
Re: Deadlock MySQL 5.7
« Reply #5 on: July 22, 2017, 04:35:07 PM »
mohon maaf sebelumnya bahwa mungkin komentar saya dibawah ini tidak benar" memberikan solusi atas permasalahan anda.
saya hanya tertarik/tergelitik melihat pernyataan anda :

Quote
penggunaan LOCK disini berbeda fungsi dengan transaction

kalau boleh saya tau, terkait dengan kalimat anda, yg saya quote, fungsi transaction di database mysql/mssql/oracle dll itu apa?, menurut opini anda...

kalau untuk saya, transaction itu adalah subsytem/submechanism yang berarti sebuah feature yang terdiri atas beberapa fungsi; sedangkan LOCK, adalah fungsi (= me lock file). mungkin banyak orang/programmer database (terutama yang dBase/Clipper/FoxPro minded) yang tidak tahu bahwa salah satu fungsi yang terdapat dalam transaction adalah LOCK. untuk membuktikannya (itupun kalau anda" open minded dan bersedia mengikuti langkah-langkah sederhana dibawah ini), kita akan buat aplikasi database sederhana ) :

a. buat database misal test. saya asumsikan di sini kita hanya membuatnya di OS Windows, xampp yang localhost (kita hanya menggunakan mysql nya saja), untuk  menyederhanakan contoh, xampp nya saya asumsikan juga sudah diinstall dan untuk UI kita gunakan Visual Foxpro.

b. buat table di mySQL, misal jual.
    kerangka nya : nnomor (int; jangan yang incremental, disini nanti kita isi manual saja), cuser (char,30).
http://prntscr.com/fyua2m
gambar 1

c. kemudian buka vfp dan buat project misal proj1.pjx

d. setelah itu buat form hingga jadi seperti ini :
http://prntscr.com/fyuaou
gambar 2.
d.1.  textbox1 kita rubah namanya jadi txtNomor
d.2. textbox2 kita rubah namanya jadi txtUser
d.3. commandbutton kita rubah namanya jadi cmdsave
(nama" diatas terserah tidak harus itu, tapi harap nanti sesuaikan dengan codingnya).

e. cmdsave; click,  kita isi dengan :
Code: [Select]
lnNomor=THISFORM.txtNomor.VALUE
lcUser=ALLTRIM(THISFORM.txtUser.VALUE)

lcconn="Driver={MySQL ODBC 3.51 Driver};Server=localhost;Port=3306;Database=test;User=root;Password=atb333999;"
nch=SQLSTRINGCONNECT(lcconn)
IF nch<=0
MESSAGEBOX('tidak bisa konek...',0,' ')
ELSE
**************************************************
* bagian pengecekan sederhana, hanya utk sample ; sebenarnya yang lebih pas, checkingnya adalah di trigger mySQL nya.
**************************************************
=SQLSETPROP(nch,"Asynchronous",.T.)
=SQLSETPROP(nch,"BatchMode",.T.)
=SQLPREPARE(nch,"select max(nnomor) as nnomor  from jual order by 1 desc limit 1;","csr_number")
lnr=0
DO WHILE lnr=0
lnr=SQLEXEC(nch)
IF lnr<0
AERROR(laerror)
MESSAGEBOX(laerror[1,2],0,' ')
EXIT
ENDIF
ENDDO
SELECT csr_number
IF ISNULL(nnomor)
lnNomor=1
ELSE
IF VARTYPE(nnomor)='C'
lnNomor=VAL(nnomor)
ENDIF

IF VARTYPE(nnomor)='N'
lnNomor=nnomor
ENDIF
lnNomor=lnNomor+1
ENDIF
* MESSAGEBOX(lnNomor,0,'')
thisform.txtNomor.Value = lnNomor

&&lcym1=LEFT(DTOS(pdtgl),4)+PADL(ALLTRIM(STR(MONTH(pdtgl))),2,"0")
&&lcpayment=pcid+"-PR"+lcym1+PADL(ALLTRIM(STR(lnnomor)),6,"0")
************************************************************
=SQLSETPROP(nch,"Asynchronous",.F.)
=SQLSETPROP(nch,"BatchMode",.T.)
lnr=SQLEXEC(nch,'START TRANSACTION')
IF lnr<0
AERROR(laerror)
MESSAGEBOX(laerror[1,2],0,' ')
RETURN
ELSE
TEXT TO lcSql NOSHOW TEXTMERGE PRETEXT 7
      INSERT jual (nnomor, cuser)
      VALUES (?lnNomor,
                          ?lcUser);
ENDTEXT
lcSql = CHRTRAN(lcSql,CHR(13)+CHR(10),[  ])
lnr=SQLEXEC(nch,lcSql)
IF lnr<0
AERROR(laerror)
MESSAGEBOX(laerror[1,2],0,' ')
RETURN

ENDIF
ENDIF
IF lnr<0
SQLEXEC(nch,'ROLLBACK')
MESSAGEBOX('Gagal Update ke database ',0+48)
ELSE
SQLEXEC(nch,'COMMIT')
ENDIF
ENDIF
SQLDISCONNECT(nch)

f. coba jalankan, untuk mengetestnya copykan .exe dari aplikasi contoh ini ke komputer lain, yang berdekatan. nanti yang satunya dengan user A, yang satuya dengan user B, hitung sampai 3, lalu tekan tombol save secara bersamaan coba lihat error apa ga, bila ada pesan error (saya yakin jarang sekali terjadi mungkin 1 : 1 milyar kemungkinan terjadi bahwa user A dan user B menekan dalam milisecond bener" bersamaan) lalu muncul pesan bahwa data mau duplicate, dan karena column nomor di set primary key maka duplicate tsb di tolak sama database.

CATATAN :
walaupun database seperti ms-access, ms visualfoxpro terdapat fasilitas transaction, transactionnya tidak bisa digunakan seperti halnya untuk mySQL, ms-SQL dll, di karenakan mrk adalah database passive, itulah kenapa banyak programmer angkatan jaman dulu, berasumsi bahwa transaction beda dengan fasilitas LOCK, padahal sebenarnya didalam fasilitas transaction salah satu fungsinya terdapat lock.  hanya saja di dalam transaction mereka kemas tidak saja fungsi lock, akan tetapi juga dimasukkan fungsi untuk mengembalikan data ke kondisi awal, bila terjadi error, dan lain-lain.


best regard,


ha
« Last Edit: July 22, 2017, 04:49:54 PM by hell_angel »
A man who can moves a mountain, begins by carrying a small stone....

Offline foxy

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 3.605
    • Foxy Land
Re: Deadlock MySQL 5.7
« Reply #6 on: July 23, 2017, 05:33:35 AM »
mohon maaf sebelumnya bahwa mungkin komentar saya dibawah ini tidak benar" memberikan solusi atas permasalahan anda.
saya hanya tertarik/tergelitik melihat pernyataan anda :

Quote
penggunaan LOCK disini berbeda fungsi dengan transaction

kalau boleh saya tau, terkait dengan kalimat anda, yg saya quote, fungsi transaction di database mysql/mssql/oracle dll itu apa?, menurut opini anda...

kalau untuk saya, transaction itu adalah subsytem/submechanism yang berarti sebuah feature yang terdiri atas beberapa fungsi; sedangkan LOCK, adalah fungsi (= me lock file). mungkin banyak orang/programmer database (terutama yang dBase/Clipper/FoxPro minded) yang tidak tahu bahwa salah satu fungsi yang terdapat dalam transaction adalah LOCK. untuk membuktikannya (itupun kalau anda" open minded dan bersedia mengikuti langkah-langkah sederhana dibawah ini), kita akan buat aplikasi database sederhana ) :

a. buat database misal test. saya asumsikan di sini kita hanya membuatnya di OS Windows, xampp yang localhost (kita hanya menggunakan mysql nya saja), untuk  menyederhanakan contoh, xampp nya saya asumsikan juga sudah diinstall dan untuk UI kita gunakan Visual Foxpro.

b. buat table di mySQL, misal jual.
    kerangka nya : nnomor (int; jangan yang incremental, disini nanti kita isi manual saja), cuser (char,30).
http://prntscr.com/fyua2m
gambar 1

c. kemudian buka vfp dan buat project misal proj1.pjx

d. setelah itu buat form hingga jadi seperti ini :
http://prntscr.com/fyuaou
gambar 2.
d.1.  textbox1 kita rubah namanya jadi txtNomor
d.2. textbox2 kita rubah namanya jadi txtUser
d.3. commandbutton kita rubah namanya jadi cmdsave
(nama" diatas terserah tidak harus itu, tapi harap nanti sesuaikan dengan codingnya).

e. cmdsave; click,  kita isi dengan :
Code: [Select]
lnNomor=THISFORM.txtNomor.VALUE
lcUser=ALLTRIM(THISFORM.txtUser.VALUE)

lcconn="Driver={MySQL ODBC 3.51 Driver};Server=localhost;Port=3306;Database=test;User=root;Password=atb333999;"
nch=SQLSTRINGCONNECT(lcconn)
IF nch<=0
MESSAGEBOX('tidak bisa konek...',0,' ')
ELSE
**************************************************
* bagian pengecekan sederhana, hanya utk sample ; sebenarnya yang lebih pas, checkingnya adalah di trigger mySQL nya.
**************************************************
=SQLSETPROP(nch,"Asynchronous",.T.)
=SQLSETPROP(nch,"BatchMode",.T.)
=SQLPREPARE(nch,"select max(nnomor) as nnomor  from jual order by 1 desc limit 1;","csr_number")
lnr=0
DO WHILE lnr=0
lnr=SQLEXEC(nch)
IF lnr<0
AERROR(laerror)
MESSAGEBOX(laerror[1,2],0,' ')
EXIT
ENDIF
ENDDO
SELECT csr_number
IF ISNULL(nnomor)
lnNomor=1
ELSE
IF VARTYPE(nnomor)='C'
lnNomor=VAL(nnomor)
ENDIF

IF VARTYPE(nnomor)='N'
lnNomor=nnomor
ENDIF
lnNomor=lnNomor+1
ENDIF
* MESSAGEBOX(lnNomor,0,'')
thisform.txtNomor.Value = lnNomor

&&lcym1=LEFT(DTOS(pdtgl),4)+PADL(ALLTRIM(STR(MONTH(pdtgl))),2,"0")
&&lcpayment=pcid+"-PR"+lcym1+PADL(ALLTRIM(STR(lnnomor)),6,"0")
************************************************************
=SQLSETPROP(nch,"Asynchronous",.F.)
=SQLSETPROP(nch,"BatchMode",.T.)
lnr=SQLEXEC(nch,'START TRANSACTION')
IF lnr<0
AERROR(laerror)
MESSAGEBOX(laerror[1,2],0,' ')
RETURN
ELSE
TEXT TO lcSql NOSHOW TEXTMERGE PRETEXT 7
      INSERT jual (nnomor, cuser)
      VALUES (?lnNomor,
                          ?lcUser);
ENDTEXT
lcSql = CHRTRAN(lcSql,CHR(13)+CHR(10),[  ])
lnr=SQLEXEC(nch,lcSql)
IF lnr<0
AERROR(laerror)
MESSAGEBOX(laerror[1,2],0,' ')
RETURN

ENDIF
ENDIF
IF lnr<0
SQLEXEC(nch,'ROLLBACK')
MESSAGEBOX('Gagal Update ke database ',0+48)
ELSE
SQLEXEC(nch,'COMMIT')
ENDIF
ENDIF
SQLDISCONNECT(nch)

f. coba jalankan, untuk mengetestnya copykan .exe dari aplikasi contoh ini ke komputer lain, yang berdekatan. nanti yang satunya dengan user A, yang satuya dengan user B, hitung sampai 3, lalu tekan tombol save secara bersamaan coba lihat error apa ga, bila ada pesan error (saya yakin jarang sekali terjadi mungkin 1 : 1 milyar kemungkinan terjadi bahwa user A dan user B menekan dalam milisecond bener" bersamaan) lalu muncul pesan bahwa data mau duplicate, dan karena column nomor di set primary key maka duplicate tsb di tolak sama database.

CATATAN :
walaupun database seperti ms-access, ms visualfoxpro terdapat fasilitas transaction, transactionnya tidak bisa digunakan seperti halnya untuk mySQL, ms-SQL dll, di karenakan mrk adalah database passive, itulah kenapa banyak programmer angkatan jaman dulu, berasumsi bahwa transaction beda dengan fasilitas LOCK, padahal sebenarnya didalam fasilitas transaction salah satu fungsinya terdapat lock.  hanya saja di dalam transaction mereka kemas tidak saja fungsi lock, akan tetapi juga dimasukkan fungsi untuk mengembalikan data ke kondisi awal, bila terjadi error, dan lain-lain.


best regard,


ha

 :icon_salut: :icon_salut: :icon_salut:

Terima kasih pak hell_ - untuk penjelasan dan contoh nya yang secara gamblang menjelaskan apa itu transaction. Untuk rekan-rekan yang belum mengerti  apa itu TRANSACTION di database, saya sangat menganjurkan mencoba dan mempelajari tutorial kecil dari pak hell_angel.

 :icon_thumright: :icon_thumright: :icon_thumright:

regards,

foxy
This post is provided as is. Feel free to use all the codes and information, however understand that I don't have any obligations to fix any bug(s) or follow up this subject.

Offline poison

  • Hero Member
  • *
  • Posts: 1.631
  • Poison 4 Women
Re: Deadlock MySQL 5.7
« Reply #7 on: July 23, 2017, 09:40:22 PM »
mohon maaf sebelumnya bahwa mungkin komentar saya dibawah ini tidak benar" memberikan solusi atas permasalahan anda.
saya hanya tertarik/tergelitik melihat pernyataan anda :

Quote
penggunaan LOCK disini berbeda fungsi dengan transaction

kalau boleh saya tau, terkait dengan kalimat anda, yg saya quote, fungsi transaction di database mysql/mssql/oracle dll itu apa?, menurut opini anda...

kalau untuk saya, transaction itu adalah subsytem/submechanism yang berarti sebuah feature yang terdiri atas beberapa fungsi; sedangkan LOCK, adalah fungsi (= me lock file). mungkin banyak orang/programmer database (terutama yang dBase/Clipper/FoxPro minded) yang tidak tahu bahwa salah satu fungsi yang terdapat dalam transaction adalah LOCK. untuk membuktikannya (itupun kalau anda" open minded dan bersedia mengikuti langkah-langkah sederhana dibawah ini), kita akan buat aplikasi database sederhana ) :

a. buat database misal test. saya asumsikan di sini kita hanya membuatnya di OS Windows, xampp yang localhost (kita hanya menggunakan mysql nya saja), untuk  menyederhanakan contoh, xampp nya saya asumsikan juga sudah diinstall dan untuk UI kita gunakan Visual Foxpro.

b. buat table di mySQL, misal jual.
    kerangka nya : nnomor (int; jangan yang incremental, disini nanti kita isi manual saja), cuser (char,30).
http://prntscr.com/fyua2m
gambar 1

c. kemudian buka vfp dan buat project misal proj1.pjx

d. setelah itu buat form hingga jadi seperti ini :
http://prntscr.com/fyuaou
gambar 2.
d.1.  textbox1 kita rubah namanya jadi txtNomor
d.2. textbox2 kita rubah namanya jadi txtUser
d.3. commandbutton kita rubah namanya jadi cmdsave
(nama" diatas terserah tidak harus itu, tapi harap nanti sesuaikan dengan codingnya).

e. cmdsave; click,  kita isi dengan :
Code: [Select]
lnNomor=THISFORM.txtNomor.VALUE
lcUser=ALLTRIM(THISFORM.txtUser.VALUE)

lcconn="Driver={MySQL ODBC 3.51 Driver};Server=localhost;Port=3306;Database=test;User=root;Password=atb333999;"
nch=SQLSTRINGCONNECT(lcconn)
IF nch<=0
MESSAGEBOX('tidak bisa konek...',0,' ')
ELSE
**************************************************
* bagian pengecekan sederhana, hanya utk sample ; sebenarnya yang lebih pas, checkingnya adalah di trigger mySQL nya.
**************************************************
=SQLSETPROP(nch,"Asynchronous",.T.)
=SQLSETPROP(nch,"BatchMode",.T.)
=SQLPREPARE(nch,"select max(nnomor) as nnomor  from jual order by 1 desc limit 1;","csr_number")
lnr=0
DO WHILE lnr=0
lnr=SQLEXEC(nch)
IF lnr<0
AERROR(laerror)
MESSAGEBOX(laerror[1,2],0,' ')
EXIT
ENDIF
ENDDO
SELECT csr_number
IF ISNULL(nnomor)
lnNomor=1
ELSE
IF VARTYPE(nnomor)='C'
lnNomor=VAL(nnomor)
ENDIF

IF VARTYPE(nnomor)='N'
lnNomor=nnomor
ENDIF
lnNomor=lnNomor+1
ENDIF
* MESSAGEBOX(lnNomor,0,'')
thisform.txtNomor.Value = lnNomor

&&lcym1=LEFT(DTOS(pdtgl),4)+PADL(ALLTRIM(STR(MONTH(pdtgl))),2,"0")
&&lcpayment=pcid+"-PR"+lcym1+PADL(ALLTRIM(STR(lnnomor)),6,"0")
************************************************************
=SQLSETPROP(nch,"Asynchronous",.F.)
=SQLSETPROP(nch,"BatchMode",.T.)
lnr=SQLEXEC(nch,'START TRANSACTION')
IF lnr<0
AERROR(laerror)
MESSAGEBOX(laerror[1,2],0,' ')
RETURN
ELSE
TEXT TO lcSql NOSHOW TEXTMERGE PRETEXT 7
      INSERT jual (nnomor, cuser)
      VALUES (?lnNomor,
                          ?lcUser);
ENDTEXT
lcSql = CHRTRAN(lcSql,CHR(13)+CHR(10),[  ])
lnr=SQLEXEC(nch,lcSql)
IF lnr<0
AERROR(laerror)
MESSAGEBOX(laerror[1,2],0,' ')
RETURN

ENDIF
ENDIF
IF lnr<0
SQLEXEC(nch,'ROLLBACK')
MESSAGEBOX('Gagal Update ke database ',0+48)
ELSE
SQLEXEC(nch,'COMMIT')
ENDIF
ENDIF
SQLDISCONNECT(nch)

f. coba jalankan, untuk mengetestnya copykan .exe dari aplikasi contoh ini ke komputer lain, yang berdekatan. nanti yang satunya dengan user A, yang satuya dengan user B, hitung sampai 3, lalu tekan tombol save secara bersamaan coba lihat error apa ga, bila ada pesan error (saya yakin jarang sekali terjadi mungkin 1 : 1 milyar kemungkinan terjadi bahwa user A dan user B menekan dalam milisecond bener" bersamaan) lalu muncul pesan bahwa data mau duplicate, dan karena column nomor di set primary key maka duplicate tsb di tolak sama database.

CATATAN :
walaupun database seperti ms-access, ms visualfoxpro terdapat fasilitas transaction, transactionnya tidak bisa digunakan seperti halnya untuk mySQL, ms-SQL dll, di karenakan mrk adalah database passive, itulah kenapa banyak programmer angkatan jaman dulu, berasumsi bahwa transaction beda dengan fasilitas LOCK, padahal sebenarnya didalam fasilitas transaction salah satu fungsinya terdapat lock.  hanya saja di dalam transaction mereka kemas tidak saja fungsi lock, akan tetapi juga dimasukkan fungsi untuk mengembalikan data ke kondisi awal, bila terjadi error, dan lain-lain.


best regard,


ha

ilmu baru lagiiiiiiiih.....matur suwuuuuuun.....
think BIG to get BIG thing

Offline sinyonamakoe

  • Global Moderator
  • Hero Member
  • *
  • Posts: 1.198
Re: Deadlock MySQL 5.7
« Reply #8 on: August 04, 2017, 06:08:23 PM »
..lock sama transaction itu macam dos sama windows (di dos perintah kebanyakan di ketik, terkesan sulit krn hrs dihapalkan) sedangkan di windows kita banyak menggunakan click and drag (kesannya lebih user friendly)

Apakah maksud sampean LOCK=windows dan TRANSACTION=DOS ?

Quote
Saya punya perintah seperti ini:

LOCK TABLES faktur WRITE;
UPDATE faktur SET ...
UNLOCK TABLES;

dibawah ini sample locking table foxpro/vfoxpro
Code: Text
  1. CLOSE DATABASES
  2. OPEN DATABASE (HOME(2) + 'Data\testdata')
  3. SET REPROCESS TO 3 AUTOMATIC
  4. gcOldExc = SET('EXCLUSIVE')
  5. SET EXCLUSIVE OFF
  6. SELECT 0
  7. USE customer  && Open Customer table
  8. ? LOCK('1,2,3,4', 'customer')  && Lock 1st 4 records in customer
  9. UNLOCK IN customer
  10. SET EXCLUSIVE &gcOldExc
  11.  

mirip, ato sama mungkin mekanismenya

ok, dibawah ini kutipan dari mysql, disini https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
Quote
The correct way to use LOCK TABLES and UNLOCK TABLES with transactional tables, such as InnoDB tables, is to begin a transaction with SET autocommit = 0 (not START TRANSACTION) followed by LOCK TABLES, and to not call UNLOCK TABLES until you commit the transaction explicitly. For example, if you need to write to table t1 and read from table t2, you can do this:

Code: MySQL
  1. SET autocommit=0;
  2. LOCK TABLES t1 WRITE, t2 READ, ...;
  3. ... do something with tables t1 and t2 here ...
  4. UNLOCK TABLES;
  5.  

contoh TRANSACTION mysql, cocok dengan topiknya, penomoran, tinggal translate ke vfp pake rumusnya hell_angel:

Code: MySQL
  1. -- start a new transaction
  2.  
  3. -- get latest order number
  4. select @orderNumber := max(orderNUmber)
  5. from orders;
  6. -- set new order number
  7. set @orderNumber = @orderNumber  + 1;
  8.  
  9. -- insert a new order for customer 145
  10. insert into orders(orderNumber,
  11.                    orderDate,
  12.                    requiredDate,
  13.                    shippedDate,
  14.                    status,
  15.                    customerNumber)
  16. values(@orderNumber,
  17.        now(),
  18.        date_add(now(), INTERVAL 5 DAY),
  19.        date_add(now(), INTERVAL 2 DAY),
  20.        'In Process',
  21.         145);
  22. -- insert 2 order line items
  23. insert into orderdetails(orderNumber,
  24.                          productCode,
  25.                          quantityOrdered,
  26.                          priceEach,
  27.                          orderLineNumber)
  28. values(@orderNumber,'S18_1749', 30, '136', 1),
  29.       (@orderNumber,'S18_2248', 50, '55.09', 2);
  30. -- commit changes    
  31. commit;      
  32.  
  33. -- get the new inserted order
  34. select * from orders a
  35. inner join orderdetails b on a.ordernumber = b.ordernumber
  36. where a.ordernumber = @ordernumber;
  37.  

Batasan LOCK TABLE https://dev.mysql.com/doc/refman/5.7/en/lock-tables-restrictions.html

monggo ...

Offline foxy

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 3.605
    • Foxy Land
Re: Deadlock MySQL 5.7
« Reply #9 on: August 04, 2017, 10:41:58 PM »
..lock sama transaction itu macam dos sama windows (di dos perintah kebanyakan di ketik, terkesan sulit krn hrs dihapalkan) sedangkan di windows kita banyak menggunakan click and drag (kesannya lebih user friendly)

Apakah maksud sampean LOCK=windows dan TRANSACTION=DOS ?
Saya yakin bukan itu maksud pak hell_angel; itu cuma analogi saja. Kalau Anda sudah pakai komputer IBM compatible tahun 1986-an sampai 1993 (dengan operating system PC-DOS/MS-DOS 2.x 3.x, 4.x, 5.x, dan terakhir 6.x), maka Anda pasti sudah sangat biasa dengan perintah-perintah DOS. Semua harus diketik. Dengan kata lain, semua serba tidak simple. Ini disamakan dengan perintah LOCK. Beda dengan Windows; di Windows, semua dimudahkan.  Operasi yang tadinya harus diketik satu per satu, sekarang tinggal drag-and-drop. Ini dianalogikan dengan TRANSACTION yang mengotomatisasi proses LOCk dan UNLOCK sehingga user (=programmer) tidak perlu lagi secara langsung (atau explisit) menyatakan LOCK dan UNLOCK.


regards,
foxy
This post is provided as is. Feel free to use all the codes and information, however understand that I don't have any obligations to fix any bug(s) or follow up this subject.

Offline sinyonamakoe

  • Global Moderator
  • Hero Member
  • *
  • Posts: 1.198
Re: Deadlock MySQL 5.7
« Reply #10 on: August 05, 2017, 09:08:21 AM »
Saya yakin bukan itu maksud pak hell_angel; itu cuma analogi saja....
regards,
foxy

 :icon_thumleft: :icon_thumleft:

Maaf pak foxy, saya salah quote, baru sadar rupanya itu saran dari hell_angel untuk TS, saya pikir itu reply sambungan dari TS, sekali lagi mohon maaf.

 :icon_salut: :icon_salut:

Offline foxy

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 3.605
    • Foxy Land
Re: Deadlock MySQL 5.7
« Reply #11 on: August 05, 2017, 09:20:51 AM »
@oom sinyonamakoe: :icon_thumright:  :)

foxy
This post is provided as is. Feel free to use all the codes and information, however understand that I don't have any obligations to fix any bug(s) or follow up this subject.

Offline benqz

  • Junior Member
  • *
  • Posts: 139
Re: Deadlock MySQL 5.7
« Reply #12 on: August 12, 2017, 05:35:20 AM »
Dear pak HA, maksud pernyataan saya itu karena fungsi dari penggunaan saya berbeda pak bukan bermaksud membantah atau menyalahkan ya.
Analogi program saya begini :

START TRANSACTION
.
.
(Procedure penomoran faktur -> disini fungsi LOCK DAN UNLOCK
.
.
IF berhasil
    COMMIT
    END TRANSACTION
ELSE
    ROLLBACK
ENDIF

Untuk tabel parent saya memakai field transkey dengan penomoran autoinc sebagai primary key, sedangkan field faktur tipe character.
Karena banyaknya coding dan procedure saya memilih analogi seperti itu supaya mudah men'trace'nya. Itu saja alasan saya simple.
Contoh yang bapak sampaikan itu benar tidak salah kita hanya berbeda jalur saja, anyway terima kasih buat masukannya.

Sebagai referensi saya mendapat link ini : https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_deadlock_detect

Ternyata ada fungsi baru di MySQL 5.7.15 yaitu "innodb_deadlock_detect" yang secara default diaktifkan ini biangnya yg menyebabkan deadlcok karena semua parameter wait harus diatur manual walaupun sudah OFF kan fungsinya berarti trial and error padahal program sementara berjalan.

Dengan sangat terpaksa saya kembali ke windows dengan MySQL 5.1 demi keamanan data dan kenyamanan customer, karena saya sudah trial error kurang lebih 2 - 3 bulan daripada customernya keburu ngamuk :).
Sebagai catatan di tempat customer lain saya memakai server Linux UBUNTU dengan MySQL 5.6 semua coding berjalan sempurna tanpa deadlock.

Mohon maaf saya juga belum nemu solusi ini. Jika rekan2 ada yang pengalaman memakai MySQL 5.7 atau yang lebih baru mohon di share

Salam Benqz

Offline hell_angel

  • Junior Member
  • *
  • Posts: 316
Re: Deadlock MySQL 5.7
« Reply #13 on: August 12, 2017, 06:50:03 PM »
mas benz yang baik,

Quote
Dear pak HA, maksud pernyataan saya itu karena fungsi dari penggunaan saya berbeda pak bukan bermaksud membantah atau menyalahkan ya.
Analogi program saya begini :

START TRANSACTION
.
.
(Procedure penomoran faktur -> disini fungsi LOCK DAN UNLOCK
.
.
IF berhasil
    COMMIT
    END TRANSACTION
ELSE
    ROLLBACK
ENDIF

terima kasih atas tanggapannya yang santun. kembali saya jawab disini,  bahwa dari awal saya sudah menekankan, mungkin comment saya bisa membantu masalah yang sebenarnya atau mungkin juga tidak, jadi disini paling tidak saya cuma berusaha meluruskan pendapat sebagian orang/programmer tentang transaction, kalau mas benz dan sebagian programmer disini yang pendapatnya sama seperti anda bisa terima, saya bersyukur krn saya merasa secuil pengetahuan saya berguna buat orang lain, tapi kalaupun anda tidak bisa terima, tidak masalah juga, krn tiap orang bebas dengan pendapat dan pendiriannya sendiri dan di forum ini yang nimbrungkan bukan cuma kita  :icon_biggrin:, siapa tahu kalau paling tidak jadi pertimbangan buat yang lain juga.

menyambung quote diatas, sekali lagi disitu ada kejanggalan tentang pengertian  transaction, dari alur logika diatas, terkesan seolah" bahwa transaction adalah pelengkap (disitu transaction hanya difungsikan untuk rollback, bila ada something goes wrong). padahal seperti saya kemukakan sebelumnya bhw dalam "transacton" itu terdapat beberapa function yag digabung jadi satu. mungkin ada rekan-rekan yang pernah dengar ungkapan ACID (Atomicity, Consistency, Isolation dan Durability) untuk transaction, isolation (pemisahan/pengasingan yang intinya bukan nyampur) salah satunya adalah yang berkaitan dengan lock.
https://dev.mysql.com/doc/refman/5.6/en/mysql-acid.html
https://stackoverflow.com/questions/4264849/how-to-implement-the-acid-model-for-a-database/4265293

sekarang bayangkan begini, saat di baris coding transaction dimulai, lock mechanism-nya jalan, terus setelahnya anda memanggil fungsi LOCK lagi, bukankah berarti anda melakukan LOCK 2x?. bisa saja itu penyebab knp terjadi DEAD LOCK dalam procedure simpan data anda.

dan untuk informasi : fungsi transaction, di mySQL hanya terdapat di innoDB (yang terkenal dan sering dipakai) dan BDB dan GEMINI, tapi tidak terdapat di engine myISAM. nah kalau anda melakukan LOCK manual lewat procedure anda sendiri, untuk myISAM itu baru benar (but only table lock not row lock).

http://www.codingslover.com/2015/08/differences-between-innodb-and-myisam.html

untuk setting deadlock detect, knp tidak di offkan lewat my.cnf saja, bukan innodb_wait_time_out nya yg di rubah-rubah.

itu ada di kasi tau : https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_deadlock_detect

jadi di my.cnf atau my.ini cukup di tambahkan : innodb-deadlock-detect = OFF


salam,
« Last Edit: August 12, 2017, 07:03:18 PM by hell_angel »
A man who can moves a mountain, begins by carrying a small stone....

Offline hell_angel

  • Junior Member
  • *
  • Posts: 316
Re: Deadlock MySQL 5.7
« Reply #14 on: August 12, 2017, 07:02:45 PM »
btw ada yang tau gak?, ternyata my itu nama anak co-founder mySQL.  :icon_biggrin:

https://dev.mysql.com/doc/refman/5.7/en/history.html
A man who can moves a mountain, begins by carrying a small stone....