Mego开发文档 - 事务
事务
事务允许以原子方式处理多个数据库操作。如果事务已提交,则所有操作都已成功应用于数据库。如果事务回滚,则没有任何操作应用于数据库。
默认行为
默认情况下,如果数据库提供程序支持事务,则单次的提交操作都将应用于事务中。如果任何更改失败,则事务回滚,并且没有任何更改应用于数据库。这意味着提交操作可以保证完全成功,或者在发生错误时保持数据库不被修改。
对于大多数应用程序,这种默认行为就足够了 如果您的应用程序要求认为有必要,您应该只手动控制交易。
由于Mego会支持数据DDL操作,由于部分数据库会存在隐式事务提交,所以需要严格防止提交操作与DDL操作同时执行的情况发生。
本地事务
Mego默认支持本地事务,不过用户可以使用API定制化自己的事务处理过程,主要体现在下面两点。
Database.BeginTransaction()
:用户在现有的DbContext中自行启动和完成事务的一种更简单的方法 - 允许在同一事务中组合多个操作,因此可以将所有提交或全部回滚为一个。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)
{
}
}
声明:一个新的技术或框架出现后还是需要时间的沉淀,我个人觉的至少需要半年以上的时间,所以请暂时不要将该框架应用到你觉的重要的系统中。不过也请大家可以多多试用,帮助Mego可以快速成长,感谢各位的问题及意见反馈。