本文转载自微信公众号《后端Q》,作者柯南。转载请联系后台Q公众号。控制事务可以使用DbContext.DatabaseAPI来开始、提交和回滚事务。以下示例显示在单个事务中执行的两个SaveChanges操作和一个LINQ查询:usingvarcontext=newBloggingContext();usingvartransaction=context.Database.BeginTransaction();try{context.Blogs.Add(newBlog{Url="http:blogs.msdn.com/dotnet"});context.SaveChanges();context.Blogs.Add(newBlog{Url="http://blogs.msdn.com/visualstudio"});context.SaveChanges();varblogs=context.Blogs.OrderBy(b=>b.Url).ToList();//Committransactionifallcommandssucceed,transactionwillauto-rollback//whendisposeifothercommandsfailstransaction.Commit();}catch(Exception){//TODO:Handlefailure}whileall关系数据库提供者都支持事务,但其他提供者类型在调用事务性API时可能会抛出异常或什么都不做。如果需要在更大范围内进行协调,请使用System.TransactionsAmbient事务。using(varscope=newTransactionScope(TransactionScopeOption.Required,newTransactionOptions{IsolationLevel=IsolationLevel.ReadCommitted})){usingvarconnection=newSqlConnection(connectionString);connection.Open();try{//RunrawADO.NETcommandinthetransactionvarcommand=connection.CreateCommand();命令。CommandText="DELETEFROMdbo.Blogs";command.ExecuteNonQuery();//RunanEFCorecommandinthetransactionvaroptions=newDbContextOptionsBuilder().UseSqlServer(connection).Options;using(varcontext=newBloggingContext(options)){context.Blogs.Add(newBlog{Url="http://blogs.msdn.com/dotnet"});context.SaveChanges();}//Committransactionifallcommandssucceed,transactionwillauto-rollback//whendisposedifeithercommandsfailsscope.Complete();}catch(Exception){//TODO:Handlefailure}}还可以在显式事务中登录。使用(vartransaction=newCommittableTransaction(newTransactionOptions{IsolationLevel=IsolationLevel.ReadCommitted})){varconnection=newSqlConnection(connectionString);尝试{varoptions=newDbContextOptionsBuilder()。UseSqlServer(连接)。选项;使用(varcontext=newBloggingContext(选项)){context.Database.OpenConnection();context.Database.EnlistTransaction(transaction);//运行rawADO.NETcommandinthetransactionvarcommand=connection.CreateCommand();command.CommandText="DELETEFROMdbo.Blogs";command.ExecuteNonQuery();//RunanEFCorecommandinthetransactioncontext.Blogs.Add(newBlog{Url="http://blogs.msdn.com/dotnet"});context.SaveChanges();context.Database.CloseConnection();}//Committransactionifallcommandssucceed,transactionwillauto-rollback//whendisposedifeithercommandsfailstransaction.Commit();}catch(Exception){//TODO:Handlefailure}}System.Transactions的限制EFCore依赖数据库提供程序以实现对System.Transactions的支持。如果提供者不实现对System.Transactions的支持,则可能会完全忽略对这些API的调用。SqlClient支持它。从.NETCore2.1开始,System.Transactions实现不包括对分布式事务的支持,因此TransactionScope或CommittableTransaction不能用于跨多个资源管理器协调事务。