LinQ to SQL 并发与事务(4)

再通过Sql Server管理器可以看到上面这两条数据都没有被插入到数据库中。通过Reflector可以发现在SubmitChanges的时候,Linq to SQL默认创建了一个孤立级别为Read Committed的事务(它表示已提交的更新在事务间是可见的,具体有哪些孤立级别可以参考ADO.NET相关资料):

  
  
public virtual void SubmitChanges(ConflictMode failureMode)
{ ... transaction
= this .provider.Connection.BeginTransaction(IsolationLevel.ReadCommitted);
this .provider.Transaction = transaction;
}

  如果不想使用默认的事务设置,比如想改变事务的孤立级别,我们可以给DataContext的Transaction属性赋值,以此使用自定义的事务。

  
  
ctx.Transaction = ctx.Connection.BeginTransaction(System.Data.IsolationLevel.Serializable);
try
{
ctx.SubmitChanges();
ctx.Transaction.Commit();
}
catch
{
ctx.Transaction.Rollback();
throw ;
}
finally
{
ctx.Transaction
= null ;
}

  最后一种方式是通过TransactionScope创建轻量级事务,就像在ADO.NET中使用一样:

  
  
using (TransactionScope scope = new TransactionScope())
{
ctx.SubmitChanges();
scope.Complete();
}

  上面的例子看起来似乎多此一举,因为在SubmitChanges中会创建默认的事务,但是改成下面这样,就只能使用自定义的事务了:

  
  
using (TransactionScope scope = new TransactionScope())
{
ctx.ExecuteCommand(
" exec .... " );
ctx.ExecuteCommand(
" exec .... " );
ctx.ExecuteCommand(
" exec .... " );
ctx.SubmitChanges();
scope.Complete();
}

  不管ExecuteCommand里面执行了哪些操作,我们都能够指明这些行为和SubmitChanges处于同一个事务中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值