Dovrei usare Nhibernate per una tabella delle impostazioni di una riga

3

Sto usando Nhibernate in un progetto abbastanza grande.

Il sistema ha una tabella delle impostazioni che ha 10 colonne e una riga, c'è sempre una riga e non dovrebbe essere cancellata solo modificata. La concorrenza può essere un problema in quanto molti client possono incrementare colonne nella tabella come LastReceiptId.

Sto pensando, non può essere una buona idea usare Nhibernate per risolvere questo problema.

Con raw sql posso usare una transazione e bloccare la tabella, ad esempio: With (TABLOCKX, HOLDLOCK) mentre seleziono e aggiorno LastReceiptId.

Hai qualche motivo per usare o non usare il metodo nhibner in una situazione come questa?

    
posta Jakob 18.08.2015 - 19:53
fonte

2 risposte

2

Il tuo post mi dà l'impressione (forse falsa?) di mettere in discussione l'uso di NHibernate per intero, a causa di un problema minore che non può essere risolto direttamente da un ORM. In realtà, in una situazione del genere proverei a creare una soluzione alternativa per il problema minore (forse ti ho sbagliato, ed è quello che hai già in mente).

Per il caso che hai descritto, sono abbastanza sicuro che alcune procedure memorizzate aggiuntive possano essere utilizzate per risolvere il tuo problema (si presume che tu stia utilizzando un sistema di database con supporto di stored procedure completo). Ad esempio, se hai bisogno di operazioni INSERT personalizzate con gestione specifica di ID e / o di blocco, incapsula l'operazione in una stored procedure e combinala con NHibernate come mostrato qui . Non sono un esperto di NHibernate, ma troverai maggiori informazioni sulla combinazione con stored procedure su Stackoverflow.

    
risposta data 19.08.2015 - 08:03
fonte
1

Indipendentemente da ciò che usi, devi assicurarti di bloccare il singolo record nella tabella delle impostazioni per il minor tempo possibile. È il collo della bottiglia in tutta la tua creazione di scontrini. Per questo motivo, lo farei in 3 passaggi con i primi 2 inclusi in una transazione (credo che Nhibernate possa farlo).

Crea registro ricevute

  1. Avvia transazione: Aggiorna la tabella delle impostazioni con il nuovo ID ricevuta (rendendosi conto che è necessario ottenere l'ID corrente ed eseguire calc per incrementare.)
  2. Inserisci il nuovo ID ricevuta nella tabella degli scontrini: Termina transazione.

Salva registro ricevute

  1. Aggiorna la tabella di ricezione in base all'ID ricevuta per la voce utente corrente con tutti gli altri dati pertinenti forniti dall'utente. Non c'è motivo di aspettare che l'utente salvi l'intero record.

Non credo che il tuo database consentirà a un'altra transazione di leggere il record sporco nella tabella delle impostazioni durante la transazione che include i passaggi 1 e amp; # 2 a meno che non facciate una sorta di "no lock" over-ride.

Se l'utente cambia idea dopo aver creato l'ID di ricevuta univoco, dovrai solo fare una sorta di eliminazione (magari morbida) per quel record e mangerne solo l'ID. Mi rendo conto che in alcuni sistemi IVA questi ID sono importanti e devono essere incrementali, motivo per cui raccomando la cancellazione software.

    
risposta data 19.08.2015 - 19:45
fonte

Leggi altre domande sui tag