Jag har ett problem med en ASP.NET applikation som ska hämta nästa lediga sekvensnummer från en tabell för att sedan göra insert i ett antal andra tabeller utifrån detta sekvensnummer. Vi hade en diskussion om detta för någon dag sen: Finns det inget sätt att förhindra att två eller fler kan accessa samma kod samtidigt på ett smidigt sätt, det enda jag kan tänka mig annars är att sätta en applikationsvariabel som håller reda på om någon håller på att ta fram ett nytt sekvensnummer Det måste väl finnas något i stil med TTSBegin / TTSCommit ? <b>>applikationsvariabel som håller reda på om någon håller på att ta fram ett nytt sekvensnummer</b> Kolla tråden. Problem med transaktioner
Jag har ett index på en viss tabell som talar om att sekvensnumret ska vara unikt för varje rad.
Problemet jag har är att ibland kan det hända att man får samma sekvensnummer om man anropar den funktion som läser upp sekvensnumret samtidigt med två olika webbläsare.
När jag läser upp sekvensnumret och sedan uppdaterar tabellen med nästa lediga sekvensnummer så använder jag mig av en databastransaktion.
Jag har provat allt tycker jag.
Databastransaktioner med olika isolationmode
System.Threading.Monitor.Enter(this);
....
....
....
System.Threading.Monitor.Exit(this);
Lock(this)
{
...
...
...
}
funktionen som anropas ser ut såhär
private int getNextNumber()
{
int iNumber = 0;
sSql = "select max(nextnumber) from tblSekv";
dr = GetDataReader(sSql);
if (dr.Read())
{
iNumber = dr.GetInt32(0);
}
dr.Close();
iNumber++;
sSql = "update tblSekv set nextnumber=" + iNumber;
ExecuteSql(sSql);
}
return iNumber;
}
Är det någon duktig mäniska som kan hjälpa mig med detta jag har helt slut på ideer och kan inte hitta nåt matnyttigt på google.Sv: Problem med transaktioner
[Startvärde på en räknare i access .]Sv:Problem med transaktioner
Sv: Problem med transaktioner
Som låster tabellen för en unika användare ?
/MartinSv: Problem med transaktioner
Hjälper tyvärr inte heller helt. Du kan få aningen färre krockar, men det är inte foolproof.Sv: Problem med transaktioner
1. Det "riktiga" är ju att låsa tabellen helt, för all utomstående syn, men det verkar inte som att det finns låsningsgrader som gör detta. Mitt förslag var att lägga in en insert först för att på så sätt låsa den. En annan variant är att göra det olagligt att ha dubletter. Det kommer ge dig felmeddelanden som du får hantera, och på så sätt löser du det.
2. Koden som den är skriven nu är väldigt olämpad, alldeles för långsam. Gör hellre allt i ett enda anrop., så har du lite bättre chans.
3. Oavsett vad du än försöker med måste du på någon nivå få tag i ett "blocking call". Detta görs via trådar eller processer. Exakt hur du ska göra vet jag inte, men är det helt nödvändigt att det aldrig kan inträffa, så måste du gå till en sån nivå. Det räcker inte med en applikationsvid variabel, om du inte har tillgång till en test-and-set-möjlighet, aka mutex.