Lock dataset while other user is editing
Lock dataset while other user is editing
Hi
We are trying to implement a dataset lock if another user is already editing the same datatset.
Because every user is logged in, we know the id of the user. This id should be written to the dataset on opening the editor and reset after submitting or closing the editor.
On submit this works perfectly. But on closing we have the issue, that if another row in the table is selected, another dataset is updated with the user lock.
Here is our edit button code:
{
text: '<i class="fas fa-pen"></i>',
action: function ( ) {
var refID = adressenTable.rows( { selected: true } ).data()[0].viw_adressen.RefID;
var KontakteID = adressenTable.rows( { selected: true } ).data()[0].viw_adressen.KontakteID;
var adressenTableSelectedRows = adressenTable.rows( { selected: true } );
var adressenTableSelectedRow = adressenTable.row( { selected: true } ).index();
adressenTable.ajax.reload(function(e){
// Fehlermeldung ausgeben wenn der Datensatz bereits bearbeitet wird
if (adressenTableSelectedRows.data()[0].viw_adressen.useredit > 0){
swal({
title: "Warnung",
text: "Dieser Datensatz wird bereits bearbeitet.",
type: "warning"
});
} else if (!$('#row_'+KontakteID).length){
swal({
title: "Warnung",
text: "Der Status dieses Datensatzes ist in Bearbeitung. Bitte neu selektieren.",
type: "warning"
});
} else {
editorFirma.edit( adressenTableSelectedRow, false )
.set( 'viw_adressen.useredit', 22 )
.submit(function(){
// Informationsbox mit Memo anzeigen falls Memo vorhanden
if (adressenTableSelectedRows.data()[0].viw_adressen.KontakteAlarmText){
swal({
title: "Information",
text: adressenTableSelectedRows.data()[0].viw_adressen.KontakteAlarmText,
type: "info"
});
}
// Firma bearbeiten
if (KontakteID == refID) {
editorFirma.edit('#row_'+refID).buttons( {
text: 'Speichern',
action: function () {
// Datensatz freigeben
this.set( 'viw_adressen.useredit', "" );
this.submit();
}
} );
} else {
// Firmenkontakt bearbeiten
editorKontakt.edit('#row_'+KontakteID).buttons( {
text: 'Speichern',
action: function () {
// Datensatz freigeben
this.set( 'viw_adressen.useredit', "" );
this.submit();
}
} );
}
});
}
// Beim schliessen den User wieder aus dem Datensatz austragen
editorFirma.on( 'close', function ( e, json/*, data */) {
editorFirma.edit( adressenTableSelectedRow, false )
.set( 'viw_adressen.useredit', "" )
.submit();
} );
editorKontakt.on( 'close', function ( e, json/*, data */) {
editorKontakt.edit( adressenTableSelectedRow, false )
.set( 'viw_adressen.useredit', "" )
.submit();
} );
}, false);
},
titleAttr: 'Bearbeiten',
enabled: false,
className: 'space'
},
We also tried to disable pointer-events while processing, but it seems, that pointer-events is enabled in between closing and updating:
$('table')
.on( 'processing.dt', function ( e, settings, processing ) {
$('table').css( 'pointer-events', processing ? 'none' : 'auto' );
} )
.dataTable();
Thank you very much in advance!
Replies
When you say "dataset" do you mean the entire database table? So you are implementing table level locking, rather than row level locking?
If that's the case, which dataset / table is being updated with the user lock? I don't really understand how that would happen I'm afraid - surely the release would just delete the lock from the locking table?
Allan
Hi allan
Thank you very much for oyur reply.
Sorry for not describing it properly: With dataset I mean 1 row in a database table (I meant record - false friend: German "datensatz" means "record" and not "dataset".
So what we want is row level locking.
Ah! Thanks for the explanation. So slightly rewriting your first post:
That sounds correct to me. On the Editor open (or row select if you prefer) then the lock should be applied. On close it should be released (regardless of if the close is caused by a successful submit or the form just being closed without saving by the end user).
The
open
andclose
events are the ones I would suggest using for this.Allan
Hi Allan
Thank you very much for your explanation.
We have the problem, that sometimes the wrong records are being unlocked. The record that has been actually edited stays locked. We don't know why this happens. I assume, that the event "on close" fires too late and that it is possible to select another record in the meantime. I've observed that the "please wait" popup is shown twice: Once for saving the editor form (mysql update) and after this once more for updating the user lock. Somehow it seams possible to change the record between these two updates. In this case, the record stays locked.
Is there a way to prevent all user interaction before the "on close" event has finished updating the record?
Last bu not least: Thank you very much for you great work!
I've found a solution:
I'm using the function variable "e" to get the correct row. Now it works.
Nice one - thanks for posting back with your solution.
Allan