---
title: "Råd vid transaktioner"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/98657-råd-vid-transaktioner"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Nöff"
published: "2004-03-03T16:07:49.000Z"
updated: "2004-03-04T22:19:23.000Z"
replies: 4
views: 235
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/98657-råd-vid-transaktioner"
---

# Råd vid transaktioner

## #1 — Nöff, 2004-03-03T16:07Z

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();
```

Permalänk: https://www.webforum.nu/p/98657

## #2 — LarsG, 2004-03-03T19:30Z

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.

Permalänk: https://www.webforum.nu/p/1289104

## #3 — Nöff, 2004-03-03T21:49Z

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

Permalänk: https://www.webforum.nu/p/1289199

## #4 — Engine^, 2004-03-04T16:53Z

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.

Permalänk: https://www.webforum.nu/p/1289554

## #5 — Nöff, 2004-03-04T22:19Z

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.

Permalänk: https://www.webforum.nu/p/1292722

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/98657-råd-vid-transaktioner
