Mego开发文档 - 事务

事务

事务允许以原子方式处理多个数据库操作。如果事务已提交,则所有操作都已成功应用于数据库。如果事务回滚,则没有任何操作应用于数据库。

默认行为

默认情况下,如果数据库提供程序支持事务,则单次的提交操作都将应用于事务中。如果任何更改失败,则事务回滚,并且没有任何更改应用于数据库。这意味着提交操作可以保证完全成功,或者在发生错误时保持数据库不被修改。

对于大多数应用程序,这种默认行为就足够了 如果您的应用程序要求认为有必要,您应该只手动控制交易。

由于Mego会支持数据DDL操作,由于部分数据库会存在隐式事务提交,所以需要严格防止提交操作与DDL操作同时执行的情况发生。

本地事务

Mego默认支持本地事务,不过用户可以使用API定制化自己的事务处理过程,主要体现在下面两点。

  1. Database.BeginTransaction():用户在现有的DbContext中自行启动和完成事务的一种更简单的方法 - 允许在同一事务中组合多个操作,因此可以将所有提交或全部回滚为一个。
  2. Database.UseTransaction():它允许DbContext使用在框架之外启动的事务。

有时候你会想要一个范围更广的事务,它包括在Mego以外的同一个数据库上的操作。要完成此操作,必须打开连接并自己启动事务,然后告诉数据上下文使用已打开的数据库连接,并且使用该连接上的现有事务。

要做到这一点,你必须在你的上下文类中定义和使用一个构造函数,它继承自一个带有现有连接参数和一个contextOwnsConnection布尔值的DbContext构造函数。

using (var conn = new SqlConnection("...")) 
{ 
    conn.Open(); 
    using (var context = new BloggingContext(conn, contextOwnsConnection: false)) 
    { 
    } 
}

分布式事务

如果您需要在更大范围内进行协调,则可以使用环境事务。

以下代码摘自EntityFramework官网

using (var scope = new TransactionScope(
    TransactionScopeOption.Required, 
    new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
{
    var connection = new SqlConnection(connectionString);
    connection.Open();
    try
    {
        var command = connection.CreateCommand();
        command.CommandText = "DELETE FROM dbo.Blogs";
        command.ExecuteNonQuery();

        var options = new DbContextOptionsBuilder<BloggingContext>()
            .UseSqlServer(connection)
            .Options;

        using (var context = new BloggingContext(options))
        {
            context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
            context.SaveChanges();
        }

        scope.Complete();
    }
    catch (System.Exception)
    {
        
    }
}

[文档目录]

posted @ 2018-04-08 22:09  CarefreeXT  阅读(159)  评论(0编辑  收藏  举报