.net - readcommitted - transaction vb net sql server
¿Cómo crear una transacción LINQ to SQL? (2)
Envuelva todo en un TransactionScope
. Llame a transaction.Complete()
en el punto donde desea comprometerse. Si el código sale del bloque sin que se llame a Complete()
, la transacción se revertirá. Sin embargo, después de mirar la respuesta de @s_ruchit y volver a examinar su código, probablemente podría volver a escribir esto para no requerir un TransactionScope
. El primer ejemplo usa TransactionScope
con su código tal como está. El segundo ejemplo realiza algunos cambios menores, pero logra el mismo propósito.
Un lugar donde necesitaría usar TransactionScope
es cuando está leyendo un valor de la base de datos y usándolo para establecer un nuevo valor en un objeto que se agrega. En este caso, la transacción LINQ no cubrirá la primera lectura, solo la posterior presentación del nuevo valor. Dado que está utilizando el valor de la lectura para calcular un nuevo valor para la escritura, necesita que la lectura esté envuelta en la misma transacción para garantizar que otro lector no calcule el mismo valor y obvie su cambio. En su caso, solo realiza escrituras para que la transacción LINQ estándar funcione.
Ejemplo 1:
var created = false;
using (var transaction = new TransactionScope())
{
try
{
var newCharacter = new Character();
newCharacter.characterName = chracterName;
newCharacter.characterLevel = 1;
newCharacter.characterExperience = 0;
newCharacter.userUsername = userUsername;
newCharacter.characterClassID = ccslst[0].characterClassID;
ydc.Characters.InsertOnSubmit(newCharacter);
ydc.SubmitChanges();
foreach (var ccs in ccslst)
{
var cs = new CharacterStat();
cs.statId = ccs.statID;
cs.statValue = ccs.statValue;
cs.characterID = newCharacter.characterID;
ydc.CharacterStats.InsertOnSubmit(cs);
}
var ccblst = ydc.ClassBodies.Where(cb => cb.characterClassID == newCharacter.characterClassID);
foreach (var ccb in ccblst)
{
var charBody = new CharacterBody();
charBody.bodyId = ccb.bodyId;
charBody.bodyPartId = ccb.bodyPartId;
charBody.characterID = newCharacter.characterID;
ydc.CharacterBodies.InsertOnSubmit(charBody);
}
ydc.SubmitChanges();
created = true;
transaction.Complete();
}
catch (Exception ex)
{
created = false;
}
}
return created;
Ejemplo 2:
try
{
var newCharacter = new Character();
newCharacter.characterName = chracterName;
newCharacter.characterLevel = 1;
newCharacter.characterExperience = 0;
newCharacter.userUsername = userUsername;
newCharacter.characterClassID = ccslst[0].characterClassID;
ydc.Characters.InsertOnSubmit(newCharacter);
foreach (var ccs in ccslst)
{
var cs = new CharacterStat();
cs.statId = ccs.statID;
cs.statValue = ccs.statValue;
newCharacter.CharacterStats.Add(cs);
}
var ccblst = ydc.ClassBodies.Where(cb => cb.characterClassID == newCharacter.characterClassID);
foreach (var ccb in ccblst)
{
var charBody = new CharacterBody();
charBody.bodyId = ccb.bodyId;
charBody.bodyPartId = ccb.bodyPartId;
newCharacter.CharacterBodies.Add(charBody);
}
ydc.SubmitChanges();
created = true;
}
catch (Exception ex)
{
created = false;
}
Tengo una pieza de código que implica varias inserciones, pero necesito ejecutar el método de enviar cambios antes de terminar de insertar en otras tablas para poder adquirir una Id. He estado buscando a través de Internet y no he podido encontrar cómo crear una transacción en linq a sql. He puesto comentarios en el código donde quiero que se realice la transacción.
var created = false;
try
{
var newCharacter = new Character();
newCharacter.characterName = chracterName;
newCharacter.characterLevel = 1;
newCharacter.characterExperience = 0;
newCharacter.userUsername = userUsername;
newCharacter.characterClassID = ccslst[0].characterClassID;
//Open transaction
ydc.Characters.InsertOnSubmit(newCharacter);
ydc.SubmitChanges();
foreach (var ccs in ccslst)
{
var cs = new CharacterStat();
cs.statId = ccs.statID;
cs.statValue = ccs.statValue;
cs.characterID = newCharacter.characterID;
ydc.CharacterStats.InsertOnSubmit(cs);
}
var ccblst = ydc.ClassBodies.Where(cb => cb.characterClassID == newCharacter.characterClassID);
foreach (var ccb in ccblst)
{
var charBody = new CharacterBody();
charBody.bodyId = ccb.bodyId;
charBody.bodyPartId = ccb.bodyPartId;
charBody.characterID = newCharacter.characterID;
ydc.CharacterBodies.InsertOnSubmit(charBody);
}
ydc.SubmitChanges();
created = true;
//Commit transaction
}
catch (Exception ex)
{
created = false;
//transaction Rollback;
}
return created;
EDITAR: Olvidé mencionar que ydc es mi datacontext
No es necesario realizar una implementación de transacción explícita mientras se usa LINQ to SQL. Todas las operaciones DB están envueltas en una transacción por defecto.
Ex:
AppDataContext db = new AppDataContext();
<In memory operation 1 on db>
<In memory operation 2 on db>
<In memory operation 3 on db>
<In memory operation 4 on db>
db.SubmitChanges();
Todas las operaciones entre la inicialización de db DataContext y db.SubmitChanges () están envueltas alrededor de una transacción de base de datos por .Net, lo que garantiza que su base de datos sea coherente y que la integridad de la propiedad se mantenga en todas las tablas.
Lea un artículo Por Scott Guthrie here : - here