Iniziamo a rispondere alla prima domanda. Non ho un indice id = 1.
Sì, lo fai !!
Diamo un'occhiata al database di Adventure Works 2012 su SQL Server 2014 CTP2. Questa è la mia specifica del portatile.
C'è un nome di tabella [AWBuildVersion]. Ha un indice cluster proprio come il tuo tavolo. Sotto gli indici, possiamo vedere che il PK sta mostrando. Se otteniamo l'id oggetto della tabella (sys.objects) e cerchiamo la voce per l'indice (sys.indexes), possiamo vedere che l'indice è in posizione 1.
In breve, una chiave primaria per impostazione predefinita è un indice cluster.
http://technet.microsoft.com/en-us/library/ms177443(v=sql.105).aspx
Okay, allora che cosa fa una tabella senza un indice ha? Queste tabelle sono chiamate heap. Hanno un loro indice nella posizione zero che punta alla prima pagina IAM.
http://technet.microsoft.com/en-us/library/ms188270(v=sql.105).aspx
Il codice di seguito crea uno schema chiamato [furbo] e copia il tavolo [AWBuildVersion] per un nuovo schema utilizzando SELECT INTO. La cosa bella di SELECT INTO è che nessun indice viene riportato.
use AdventureWorks2012
go
create schema [crafty] authorization [dbo];
go
select * into crafty.awbuildversion from dbo.awbuildversion
go
In breve, possiamo vedere lo heap definito con un indice in posizione zero.
Così che cosa è una situazione di stallo e che cosa fa richiesta modalità U significa?
Un deadlock si verifica quando due processi acquisiscono le risorse contemporaneamente ma non nello stesso ordine. In breve, entrambi i processi non possono procedere. Il motore seleziona la sessione con il minor tempo di rollback e uccide il processo.
http://technet.microsoft.com/en-us/library/ms178104(v=sql.105).aspx
una foto vale più di mille parole! Transaction 1 grabs resource 1. Transaction 2 grabs resource 2. Quando tentano di afferrare le risorse reciproche, viene creato un deadlock.
Che cosa fa un blocco e l'utente in modalità tasto U significa?
Per aggiornare la tabella, è necessario aggiornare le pagine di dati/indice. Ma le pagine di dati sono in realtà pagine indice (indice cluster) nella tabella. SQL Engine elimina un blocco (U) PDATE. Questo blocco verrà inoltrato a un blocco esclusivo (X) durante l'aggiornamento effettivo.
Quando due processi richiedono un blocco Esclusivo, esiste un potenziale di un deadlock.
Per completare questo argomento, i blocchi condivisi (SELECT) possono essere eseguiti senza bloccare (allo stesso tempo) Di solito un processo inizia con il blocco e si trasforma in un deadlock quando il thread del processo di deadlock di Engines rileva il grafico ciclico.
Il livello di isolamento predefinito è Non letto.
http://technet.microsoft.com/en-us/library/ms175519(v=sql.105).aspx
A questo punto, si ha una situazione di stallo.
Dove vai da qui?
1 - È probabile che più di una sessione (SPID) esegua lo stesso codice. Perché? Puoi cambiare questo in modo che solo un processo esegua il codice alla volta?
2 - Prendere il TSQL effettivo generato da JDBC. Questo può essere fatto con SQL Profiler e/o guardando attraverso i tuoi DMV.
L'istruzione di unione esegue sia un UPDATE e/o INSERT. Quindi un'operazione composta.
3 - È possibile modificare il livello di isolamento in serializzabile?
Questo aggiungerà più blocchi e probabilmente cambierà il problema del deadlock in un problema di timeout. Vedi l'articolo di Kalen Daleny su come impostare LOCK_TIMEOUT. Dovrai modificare il codice per riprovare l'operazione con un po 'di ritardo.
http://sqlmag.com/sql-server/inside-sql-server-controlling-locking
Spero che queste informazioni ti aiuta.
Si prega di inviare il vostro TSQL se avete bisogno di più aiuto.