webForumDet fria alternativet

Råd vid transaktioner

4 svar · 208 visningar · startad av Nöff

NöffMedlem sedan nov. 2003569 inlägg
#1

Hej.

Ska lägga in 2 miljoner poster i en databas.
Ska foreach loopa och använda INSERT INTO Och en massa SELECT @@IDENTITY för att jag ska uppdatera andra tabeller samtidigt med ID numrena, därav är ju transaktion nödvändig.

Men jag är lite kluven.... ska jag lägga transaktionskopplingen i eller utanför forloopen?. Pallar verkligen Sql servern Rollbacka 2 miljoner poster om 1 endaste post skulle gå åt pipan vid insättningen?, eller ska jag skapa ett Transaction objekt vid varje loop?, så ifall nåt går snett Rollbackas bara den 1 post som gick snett och inte hela skiten. skål :birp

SÅHÄR:

SqlCommand.Connection.Open();
SqlCommand.Transaction=SqlCommand.Connection.BeginTransaction(IsolationLevel.Serializable);
try
{	

	foreach(DataRow rowsen in  thetable.Rows)
	{
		//INSERT, SELECT @@IDENTITY, INSERT  etc etc osv osv.
	}//foreach

SqlCommand.Transaction.Commit();
}
catch(Exception fuckup)
{
	SqlCommand.Transaction.Rollback();
}
thetable.Dispose();
SqlCommand.Connection.Close();

ELLER SÅHÄR:

foreach(DataRow rowsen in  thetable.Rows)
{
		
	SqlCommand.Connection.Open();
	SqlCommand.Transaction=SqlCommand.Connection.BeginTransaction(IsolationLevel.Serializable);
	try
	{
		//INSERT, SELECT @@IDENTITY, INSERT  etc etc osv osv.
	SqlCommand.Transaction.Commit();
	}
	catch(Exception fuckup)
	{
		SqlCommand.Transaction.Rollback();
	}

SqlCommand.Transaction.Dispose();
SqlCommand.Connection.Close();
}//foreach

thetable.Dispose();
LarsGMedlem sedan dec. 200012 464 inlägg
#2

Om du kör allt i en transaktion så kommer du säkert att råka på problem med att det blir för stort.

Om du kör varje post i en transaktion så blir det sämre prestanda.

Du kan ju göra en kompromiss och göra commit efter var 1000:e post t.ex.

Sen så måste du ha någon hantering så att det går att ladda en delmängd om någon transaktion misslyckas.

NöffMedlem sedan nov. 2003569 inlägg
#3

prestanda gör inget, eftersom det bara ska göras 1 gång. men det där om delmängd, vad är det?

Engine^Medlem sedan dec. 20003 887 inlägg
#4

Kompromissen att göra en commit för var 1000:e post delar ju upp all data i grupper om 1000 och en delmängd i det här fallet är alltså varje grupp om 1000 poster.

NöffMedlem sedan nov. 2003569 inlägg
#5

jo testade att köra en transaktion per loop, och det funka bra, prestandan dog inte särskilt mycket konstigt nog, och nu rollbacka den enbart posten som gick snett. det måste nog vara det bästa.

133 ms totalt · 3 externa anrop · v20260731065814-full.beb2e261
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)