第五节:EF Core中的三类事务(SaveChanges、DbContextTransaction、TransactionScope)

一. 说明

 EF版本的事务介绍详见:

  第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges、DBContextTransaction、TransactionScope)。

  本节主要介绍EF Core下的三种事务的用法和各自的使用场景,其中SaveChanges和DBContextTransaction事务与EF版本的基本一致,在该章节中补充一些新的使用场景和配置方式,TransactionScope环境事务与EF 版本的有着本质的区别,它目前不支持分布式数据库事务。

  后面章节将继续介绍事务的基础概念、事务的隔离级别和带来的各种问题。

二. 默认事务(SaveChanges)

(1).默认情况下,如果数据库提供程序支持事务,单个 SaveChanges() 调用中的所有变更都会在一个事务中被提交。如果其中任何一个变更失败了, 那么事务就会回滚,没有任何变更会被应用到数据库。这意味着 SaveChanges() 能够确保要么成功保存,要么在发生错误时不对数据库做任何修改。

(2).关闭默认事务:context.Database.AutoTransactionsEnabled = false; 如:Test3()方法,第一条数据保存成功,第二条失败。

 代码分享:

 1         /// <summary>
 2         /// 全部成功
 3         /// </summary>
 4         public static void Test1()
 5         {
 6             using (EFDB01Context db = new EFDB01Context())
 7             {
 8                 db.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now });
 9                 db.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员2", addTime = DateTime.Now });
10                 db.SaveChanges();
11             }
12         }
13 
14         /// <summary>
15         /// 全部失败
16         /// </summary>
17         public static void Test2()
18         {
19             using (EFDB01Context db = new EFDB01Context())
20             {
21                 try
22                 {
23                     db.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now });
24                     db.T_RoleInfor.Add(new T_RoleInfor() { id = 123, roleName = "管理员2", addTime = DateTime.Now });
25                     db.SaveChanges();
26                 }
27                 catch (Exception)
28                 {
29                     Console.WriteLine("出错了,两条数据都没有执行成功");
30                 }
31             }
32         }
33 
34         /// <summary>
35         /// 第一条成功,第二条失败
36         /// </summary>
37         public static void Test3()
38         {
39             using (EFDB01Context db = new EFDB01Context())
40             {
41                 try
42                 {
43                     //关闭SaveChanges的默认事务
44                     db.Database.AutoTransactionsEnabled = false;
45 
46                     db.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now });
47                     db.T_RoleInfor.Add(new T_RoleInfor() { id = 123, roleName = "管理员2", addTime = DateTime.Now });
48 
49                     //db.T_UserInfor.Add(new T_UserInfor() { id = Guid.NewGuid().ToString("N"), userName = "管理员1", addTime = DateTime.Now });
50                     //db.T_UserInfor.Add(new T_UserInfor() { id = Guid.NewGuid().ToString("N")+"123", userName = "管理员2", addTime = DateTime.Now });
51 
52                     db.SaveChanges();
53                 }
54                 catch (Exception)
55                 {
56                     Console.WriteLine("出错了,第一条数据插入成功了");
57                 }
58             }
59         }

 

三. DbContextTransaction

1. 使用方式

  BeginTransaction开启事务、Commit提交事务、Rollback回滚事务、Dispose销毁,如果用Using包裹的话,不再需要手动Rollback,走完Using会自动回滚。如果不用Using包裹事务,就需要在Catch中手动RollBack回滚,并且最好最后手动的Dispose一下。(如SameDbContext文件夹中的Test1和Test2方法)

2. 使用场景

 A. 同一个上下文多个SaveChanges的方法(如:自增主键后续要用到,如Test2方法)、SaveChanges和EF调用SQL语句混用(如Test2方法)

 1        /// <summary>
 2         /// 三条添加语句共享同一个事务,最后使用 transaction.Commit() 统一提交,三条全部执行成功,则影响到数据库,
 3         /// 如果任何一个命令失败,则在事务被回收(Dispose)时会自动回滚,对数据库无影响。 
 4         /// </summary>
 5         public static void Test1()
 6         {
 7             using (EFDB01Context db = new EFDB01Context())
 8             {
 9                 using (var transaction = db.Database.BeginTransaction())
10                 {
11                     try
12                     {
13                         db.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now });
14                         db.SaveChanges();
15 
16                         db.T_RoleInfor.Add(new T_RoleInfor() { id = 111, roleName = "管理员2", addTime = DateTime.Now });  //报错
17                         db.SaveChanges();
18 
19                         string sql1 = @"insert into T_RoleInfor (roleName,roleDescription,addTime) values (@roleName,@roleDescription,@addTime)";
20                         SqlParameter[] pars1 ={
21                                                  new SqlParameter("@roleName","管理员3"),
22                                                  new SqlParameter("@roleDescription","txt11"),
23                                                  new SqlParameter("@addTime",DateTime.Now)
24                                             };
25                         db.Database.ExecuteSqlCommand(sql1, pars1);
26                         transaction.Commit();
27 
28                         Console.WriteLine("成功了");
29                     }
30                     catch (Exception)
31                     {
32                         Console.WriteLine("失败了");
33                     }
34                 }
35             }
36         }
37 
38         /// <summary>
39         /// 如果不用Using包裹事务,就需要在Catch中手动RollBack回滚
40         /// </summary>
41         public static void Test2()
42         {
43             using (EFDB01Context db = new EFDB01Context())
44             {
45                 var transaction = db.Database.BeginTransaction();
46                 try
47                 {
48                     var d1 = new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now };
49                     db.T_RoleInfor.Add(d1);
50                     db.SaveChanges();
51 
52                     db.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员2"+d1.id, addTime = DateTime.Now });
53                     db.SaveChanges();
54 
55                     string sql1 = @"insert into T_RoleInfor (roleName,roleDescription,addTime) values (@roleName,@roleDescription,@addTime)";
56                     SqlParameter[] pars1 ={
57                                                  new SqlParameter("@roleName","管理员3"),
58                                                  new SqlParameter("@roleDescription","txt11"),
59                                                  new SqlParameter("@addTime",DateTime.Now)
60                                             };
61                     db.Database.ExecuteSqlCommand(sql1, pars1);
62                     transaction.Commit();
63 
64                     Console.WriteLine("成功了");
65 
66                 }
67                 catch (Exception)
68                 {
69                     transaction.Rollback();
70                     Console.WriteLine("失败了");
71                 }
72                 finally
73                 {
74                     transaction.Dispose();
75                 }
76 
77             }
78         }

 B. 同一个数据库多个上下文但“同一个连接”的事务。其中一个上下文开启事务,另外上下文通过UseTransaction方法来实现共享事务。

 情况①:

  EFDB01Context直接在OnConfiguring中写死连接字符串,多次new上下文,如Test1方法,则是多个连接,不能共享事务。

 1  /// <summary>
 2         /// 情况一:在OnConfiguring中书写连接字符串,创建两个上下文,相当于两个连接,两个连接之间不能通过使用UseTransaction,建立事务连接。
 3         /// 会报下面的错。
 4         /// The specified transaction is not associated with the current connection. Only transactions associated with the current connection may be used.
 5         /// </summary>
 6         public static void Test1()
 7         {
 8             using (EFDB01Context context1 = new EFDB01Context())
 9             {
10                 using (var transaction = context1.Database.BeginTransaction())
11                 {
12                     try
13                     {
14                         context1.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now });
15                         context1.SaveChanges();
16 
17                         using (EFDB01Context context2 = new EFDB01Context())
18                         {
19                             context2.Database.UseTransaction(transaction.GetDbTransaction());
20 
21                             context1.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now });
22                             context1.SaveChanges();
23                         }
24 
25                         //统一提交
26                         transaction.Commit();
27                         Console.WriteLine("成功了");
28                     }
29                     catch (Exception ex)
30                     {
31                         Console.WriteLine(ex.Message);
32                     }
33                 }
34             }
35 
36 
37         }
View Code

 情况②:

  EFDB01Context2通过 public EFDB01Context2(DbContextOptions<EFDB01Context2> options) : base(options)这种形式的构造函数,然后new的时候 统一传入: new  DbContextOptionsBuilder<EFDB01Context2>().UseSqlServer(new SqlConnection(connectionString)).Options;,从而共享连接,如Test2方法。

 1         /// <summary>
 2         /// 情况二:通过父类构造函数
 3         /// </summary>
 4         public static void Test2()
 5         {
 6             var connectionString = "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;";
 7             //将连接拿出来,传到多个上下文中,这样是共享同一个连接
 8             var option = new DbContextOptionsBuilder<EFDB01Context2>().UseSqlServer(new SqlConnection(connectionString)).Options;
 9 
10             using (var context1 = new EFDB01Context2(option))
11             {
12                 using (var transaction = context1.Database.BeginTransaction())
13                 {
14                     try
15                     {
16                         context1.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now });
17                         context1.SaveChanges();
18 
19                         using (var context2 = new EFDB01Context2(option))
20                         {
21                             context2.Database.UseTransaction(transaction.GetDbTransaction());
22 
23                             context1.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now });
24                             context1.SaveChanges();
25                         }
26 
27                         //统一提交
28                         transaction.Commit();
29                         Console.WriteLine("成功了");
30                     }
31                     catch (Exception ex)
32                     {
33                         Console.WriteLine(ex.Message);
34                     }
35                 }
36             }
37         }

 情况③:

 EFDB01Context3通过 传入SqlConnection来实现共享连接,如Test3方法。

 1         public static void Test3()
 2         {
 3             var connectionString = "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;";
 4             //将连接拿出来,传到多个上下文中,这样是共享同一个连接
 5             var connection = new SqlConnection(connectionString);
 6 
 7             using (var context1 = new EFDB01Context3(connection))
 8             {
 9                 using (var transaction = context1.Database.BeginTransaction())
10                 {
11                     try
12                     {
13                         context1.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now });
14                         context1.SaveChanges();
15 
16                         using (var context2 = new EFDB01Context3(connection))
17                         {
18                             context2.Database.UseTransaction(transaction.GetDbTransaction());
19 
20                             context1.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now });
21                             context1.SaveChanges();
22                         }
23 
24                         //统一提交
25                         transaction.Commit();
26                         Console.WriteLine("成功了");
27                     }
28                     catch (Exception ex)
29                     {
30                         Console.WriteLine(ex.Message);
31                     }
32                 }
33             }
34         }

 C. 多种数据库技术同一个数据库的事务

  如ADO.Net和EF共同使用,利用方法 “UseTransaction”共享同一个事务,共同提交。 如:Test1方法

 1         /// <summary>
 2         /// ADO.Net 和 EF混用,多种数据库技术访问同一个数据库
 3         /// </summary>
 4         public static void Test1()
 5         {
 6             var conStr = @"Server=localhost;Database=EFDB01;User ID=sa;Password=123456;";
 7             using (var connection=new SqlConnection(conStr))
 8             {
 9                 connection.Open();
10                 using (var transaction=connection.BeginTransaction())
11                 {
12                     try
13                     {
14                         //ADO.Net
15                         var command = connection.CreateCommand();
16                         command.Transaction = transaction;
17                         command.CommandText = "DELETE FROM T_RoleInfor";
18                         command.ExecuteNonQuery();
19 
20                         //EF
21                         var options = new DbContextOptionsBuilder<EFDB01Context>().UseSqlServer(connection).Options;
22                         using (var context = new EFDB01Context(options))
23                         {
24                             context.Database.UseTransaction(transaction);
25                             context.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now });
26                             context.SaveChanges();
27                         }
28                         //综合提交
29                         transaction.Commit();
30 
31                         Console.WriteLine("成功了");
32 
33                     }
34                     catch (Exception ex)
35                     {
36                         Console.WriteLine(ex.Message);
37                     }
38                 }
39                
40             }
41         }

 

四. 环境事务

1.使用方式

  new TransactionScope创建事务、Complete提交事务、 Transaction.Current.Rollback();回滚事务、Dispose销毁对象。如果用Using包裹的话,不再需要手动Rollback,走完Using会自动回滚。如果不用Using包裹事务,就需要在Catch中手动RollBack回滚,并且最好最后手动的Dispose一下。

2.用途

 A. 同一个上下文的事务。(多个SaveChanges(自增主键后续用到的情况)、SaveChanges和EF调用SQL语句混用)(如Test1方法)

 1  /// <summary>
 2         /// A. 同一个上下文的事务。(多个SaveChanges(自增主键后续用到的情况)、SaveChanges和EF调用SQL语句混用)
 3         /// </summary>
 4         public static void Test1()
 5         {
 6             using (EFDB01Context1 db = new EFDB01Context1())
 7             {
 8                 using (var scope = new TransactionScope(/*TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }*/))
 9                 {
10                     try
11                     {
12                         var data1 = new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now };
13                         db.T_RoleInfor.Add(data1);
14                         db.SaveChanges();
15 
16                         db.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员2" + data1.id, addTime = DateTime.Now });  //报错
17                         db.SaveChanges();
18 
19                         string sql1 = @"insert into T_RoleInfor (roleName,roleDescription,addTime) values (@roleName,@roleDescription,@addTime)";
20                         SqlParameter[] pars1 ={
21                                                  new SqlParameter("@roleName","管理员3"),
22                                                  new SqlParameter("@roleDescription","txt11"),
23                                                  new SqlParameter("@addTime",DateTime.Now)
24                                             };
25                         db.Database.ExecuteSqlCommand(sql1, pars1);
26                         scope.Complete();
27 
28 
29                         Console.WriteLine("成功了");
30                     }
31                     catch (Exception)
32                     {
33                         Console.WriteLine("失败了");
34                     }
35                 }
36             }
37         }
View Code

 B. 多种数据库技术访问同一个数据库的事务 (如Test2方法)

 1         /// <summary>
 2         /// B. 多种数据库技术访问同一个数据库的事务
 3         /// </summary>
 4         public static void Test2()
 5         {
 6             var conStr = @"Server=localhost;Database=EFDB01;User ID=sa;Password=123456;";
 7             using (var connection = new SqlConnection(conStr))
 8             {
 9                 connection.Open();
10                 using (var scope = new TransactionScope())
11                 {
12                     try
13                     {
14                         //ADO.Net
15                         var command = connection.CreateCommand();
16                         command.CommandText = "DELETE FROM T_RoleInfor";
17                         command.ExecuteNonQuery();
18 
19                         //EF
20                         using (var context = new EFDB01Context1())
21                         {
22                             context.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now });
23                             context.SaveChanges();
24                         }
25                         //综合提交
26                         scope.Complete();
27 
28                         Console.WriteLine("成功了");
29 
30                     }
31                     catch (Exception ex)
32                     {
33                         Console.WriteLine(ex.Message);
34                     }
35                 }
36             }
37         }
View Code

 C. 同一个数据库多个不同的上下文是支持的(如Test3方法)

上下文代码:

 1   public partial class EFDB01Context1 : DbContext
 2     {
 3         public virtual DbSet<T_RoleInfor> T_RoleInfor { get; set; }
 4         public virtual DbSet<T_UserInfor> T_UserInfor { get; set; }
 5 
 6         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 7         {
 8             optionsBuilder.UseSqlServer("Server=localhost;Database=EFDB01;User ID=sa;Password=123456;");
 9         }
10 
11         protected override void OnModelCreating(ModelBuilder modelBuilder)
12         {
13             modelBuilder.HasAnnotation("ProductVersion", "2.2.0-rtm-35687");
14 
15             modelBuilder.Entity<T_RoleInfor>(entity =>
16             {
17                 entity.Property(e => e.roleDescription).IsUnicode(false);
18 
19                 entity.Property(e => e.roleName).IsUnicode(false);
20             });
21 
22             modelBuilder.Entity<T_UserInfor>(entity =>
23             {
24                 entity.Property(e => e.id)
25                     .IsUnicode(false)
26                     .ValueGeneratedNever();
27 
28                 entity.Property(e => e.userName).IsUnicode(false);
29 
30                 entity.Property(e => e.userSex).IsUnicode(false);
31             });
32         }
33     }
EFDB01Context1
 1   public partial class EFDB01Context2 : DbContext
 2     {
 3         public virtual DbSet<T_RoleInfor> T_RoleInfor { get; set; }
 4         public virtual DbSet<T_UserInfor> T_UserInfor { get; set; }
 5 
 6         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 7         {
 8             optionsBuilder.UseSqlServer("Server=localhost;Database=EFDB01;User ID=sa;Password=123456;");
 9         }
10 
11         protected override void OnModelCreating(ModelBuilder modelBuilder)
12         {
13             modelBuilder.HasAnnotation("ProductVersion", "2.2.0-rtm-35687");
14 
15             modelBuilder.Entity<T_RoleInfor>(entity =>
16             {
17                 entity.Property(e => e.roleDescription).IsUnicode(false);
18 
19                 entity.Property(e => e.roleName).IsUnicode(false);
20             });
21 
22             modelBuilder.Entity<T_UserInfor>(entity =>
23             {
24                 entity.Property(e => e.id)
25                     .IsUnicode(false)
26                     .ValueGeneratedNever();
27 
28                 entity.Property(e => e.userName).IsUnicode(false);
29 
30                 entity.Property(e => e.userSex).IsUnicode(false);
31             });
32         }
33     }
EFDB01Context2

运行代码:

 1        /// <summary>
 2         ///C. 同一个数据库两个不同上下文是支持的
 3         /// </summary>
 4         public static void Test3()
 5         {
 6             using (var scope = new TransactionScope())
 7             {
 8                 try
 9                 {
10                     using (var context = new EFDB01Context1())
11                     {
12                         context.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now });
13                         context.SaveChanges();
14                     }
15                     using (var context = new EFDB01Context2())
16                     {
17                         context.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now });
18                         context.SaveChanges();
19                     }
20 
21                     //综合提交
22                     scope.Complete();
23 
24                     Console.WriteLine("成功了");
25                 }
26                 catch (Exception ex)
27                 {
28                     Console.WriteLine(ex.Message);
29                 }
30             }
31         }

 D. 不同数据库的上下文是不支持的,(如Test4方法,开启msdtc服务的步骤: cmd命令→ net start msdtc ,然后发现报错:This platform does not support distributed transactions.说明目前Core平台下不支持分布式事务)

上下文代码:

 1  public partial class dbCore1Context : DbContext
 2     {
 3         public dbCore1Context()
 4         {
 5         }
 6 
 7         public dbCore1Context(DbContextOptions<dbCore1Context> options)
 8             : base(options)
 9         {
10         }
11 
12         public virtual DbSet<UserInfors> UserInfors { get; set; }
13 
14         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
15         {
16             optionsBuilder.UseSqlServer("Server=localhost;Database=dbCore1;User ID=sa;Password=123456;");
17 
18         }
19 
20         protected override void OnModelCreating(ModelBuilder modelBuilder)
21         {
22             modelBuilder.HasAnnotation("ProductVersion", "2.2.0-rtm-35687");
23 
24             modelBuilder.Entity<UserInfors>(entity =>
25             {
26                 entity.Property(e => e.id).ValueGeneratedNever();
27             });
28         }
29     }
dbCore1Context
 1   public partial class EFDB01Context1 : DbContext
 2     {
 3         public virtual DbSet<T_RoleInfor> T_RoleInfor { get; set; }
 4         public virtual DbSet<T_UserInfor> T_UserInfor { get; set; }
 5 
 6         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 7         {
 8             optionsBuilder.UseSqlServer("Server=localhost;Database=EFDB01;User ID=sa;Password=123456;");
 9         }
10 
11         protected override void OnModelCreating(ModelBuilder modelBuilder)
12         {
13             modelBuilder.HasAnnotation("ProductVersion", "2.2.0-rtm-35687");
14 
15             modelBuilder.Entity<T_RoleInfor>(entity =>
16             {
17                 entity.Property(e => e.roleDescription).IsUnicode(false);
18 
19                 entity.Property(e => e.roleName).IsUnicode(false);
20             });
21 
22             modelBuilder.Entity<T_UserInfor>(entity =>
23             {
24                 entity.Property(e => e.id)
25                     .IsUnicode(false)
26                     .ValueGeneratedNever();
27 
28                 entity.Property(e => e.userName).IsUnicode(false);
29 
30                 entity.Property(e => e.userSex).IsUnicode(false);
31             });
32         }
33     }
EFDB01Context1

运行代码:

 1         /// <summary>
 2         ///D. 不同数据库之间的事务
 3         /// </summary>
 4         public static void Test4()
 5         {
 6             using (var scope = new TransactionScope())
 7             {
 8                 try
 9                 {
10                     using (var context = new EFDB01Context1())
11                     {
12                         context.T_RoleInfor.Add(new T_RoleInfor() { roleName = "管理员1", addTime = DateTime.Now });
13                         context.SaveChanges();
14                     }
15                     using (var context = new dbCore1Context())
16                     {
17                         context.UserInfors.Add(new UserInfors() { id = Guid.NewGuid().ToString("N"), userName = "管理员1", userSex = "" });
18                         context.SaveChanges();
19                     }
20 
21                     //综合提交
22                     scope.Complete();
23 
24                     Console.WriteLine("成功了");
25                 }
26                 catch (Exception ex)
27                 {
28                     Console.WriteLine(ex.Message);
29                 }
30             }
31         }

 注:EF Core中的 System.Transactions 实现将不包括对分布式事务的支持,因此不能使用 TransactionScope 或 CommittableTransaction 来跨多个资源管理器协调事务。主要分布式事务需要依赖于 Windows 系统的 MSDTC 服务,但.NET Core要实现跨平台,基于跨平台的分布式事务没有统一的标准,后续版希望改进。

 

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/yaopengfei/p/11387935.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教你简单理解分布式与传统单体架构的区别

教你简单理解分布式与传统单体架构的区别 原文:教你简单理解分布式与传统单体架构的区别分布式是一种系统架构方式&#xff0c;而在分布式系统中一般基于中间件进行开发&#xff0c;消息中间件是分布式系统中比较核心的中间件之一。这三样东西随便拿出一个来都可能要说上半天&a…

js(Dom+Bom)第五天(1)

JavaScript BOM介绍 概念 BOM&#xff08;Browser Object Model&#xff09;即浏览器对象模型。 本质&#xff1a; 通过对象抽象浏览器中的一些功能 例如&#xff1a;&#xff08;刷新页面&#xff0c;alert,confirm,pormpt,跳转 ...&#xff09;BOM顶级对象 window对象是js中…

第六节:深究事务的相关性质、隔离级别及对应的问题、死锁相关

一. 相关概念 前面系列中的章节的&#xff1a; 第二十二节: 以SQLServer为例介绍数据库自有的锁机制(共享锁、更新锁、排它锁等&#xff09;和事务隔离级别 介绍了各种锁以及事务的隔离级别&#xff0c;是从数据库的角度进行介绍的&#xff0c;本章节是通过EF Core为载体&…

js(Dom+Bom)第五天(2)

webAPI 01-事件监听 为什么要学事件监听 之前给元素注册事件的时候,同一个事件会被覆盖掉事件监听的本质 通过另外一种方式给元素注册事件, 同时可以解决同一个事件不会被覆盖掉.知识点-通过 on 方式给元素注册事件 之前注册事件的方式:事件源.onclick function() {}on是一种…

UIAutomator简介

简介 Android 4.3发布的时候包含了一种新的测试工具–uiautomator&#xff0c;uiautomator是用来做UI测试的。也就是普通的手工测试&#xff0c;点击每个控件元素 看看输出的结果是否符合预期。比如 登陆界面 分别输入正确和错误的用户名密码然后点击登陆按钮看看是否能否登陆以…

从零开始实现ASP.NET Core MVC的插件式开发(五) - 插件的删除和升级

标题&#xff1a;从零开始实现ASP.NET Core MVC的插件式开发(五) - 使用AssemblyLoadContext实现插件的升级和删除 作者&#xff1a;Lamond Lu 地址&#xff1a;https://www.cnblogs.com/lwqlun/p/11395828.html 源代码&#xff1a;https://github.com/lamondlu/Mystique 前景回…

【JavaWeb】石家庄地铁搭乘系统——第一版(功能尚未完善)

小组成员&#xff1a;高达&#xff0c;程超然 项目目的&#xff1a;能算出地铁搭乘的最优路线并显示在地图上 个人任务&#xff1a;调用队友写好的java代码&#xff0c;将结果显示在网页上 新的知识&#xff1a;百度地图API&#xff0c;使用JQuery的AJAX异步提交 进度&#xff…

扫描枪连接zebra打印机打印条码标签无需电脑

在一些流水线生产的现场&#xff0c;需要及时打印条码标签&#xff0c;由于现场环境和空间限制&#xff0c;无法摆放电脑或者通过连接电脑来打印条码标签的速度太慢&#xff0c; 瑞科条码特提供了一套扫描枪直接连接条码打印机&#xff0c;扫描枪扫描条码之后直接打印输出条码标…

简单的动画函数封装(1)

//创建简单的动画函数封装效果(目标对象&#xff0c;目标位置) function animate(obj,target){var id setInterval(function(){if(obj.offsetLeft > target){clearInterval(id);}else{obj.style.left obj.offsetLeft 5 px;}},30) }可以实现如下效果&#xff1a; <div…

NodeMCU学习(三) : 进入网络世界

阅读原文可以访问我的个人博客 把NodeMCU连接到路由器网络上 NodeMCU可以被配置为Station模式和softAP模式或者Station AP模式&#xff0c;当它被配置为Station模式时&#xff0c;就可以去连接Access Point&#xff08;如路由器&#xff09;。当它被配置为Soft Access Point模…

操作系统原理之进程调度与死锁(三)

一、进程调度的功能与时机 进程调度&#xff1a;进程调度的功能由操作系统的进程调度程序完成 具体任务&#xff1a;按照某种策略和算法从就绪态进程中为当前空闲的CPU选择在其上运行的新进程。 进程调度的时机&#xff1a;进程正常或异常结束、进程阻塞、有更高优先级进程到来…

模拟京东侧边栏

思路&#xff1a; // 1. 获取元素 // 1.1 获取一组li // 1.2 获取一组类名为item的div // 1.3 获取类名为slide的div// 2. 循环遍历给每一个li注册onmouseenter&#xff0c;并且每一个li添加一个index表示索引 // 2.1 循环遍历把所有的li的类名设置为,把所有的item的display设…

ViewPager + TabLayout + Fragment + MediaPlayer的使用

效果图 在gradle里导包 implementation com.android.support:design:28.0.0 activity_main <?xml version"1.0" encoding"utf-8"?><LinearLayout xmlns:android"http://schemas.android.com/apk/res/android" xmlns:tools"http…

vs code打开文件显示的中文乱码

这种情况下&#xff0c;一般是编码格式导致的&#xff0c;操作办法&#xff1a; 鼠标点击之后&#xff0c;上面会弹出这个界面&#xff0c;双击选中 然后从UTF-8换到GB2312&#xff0c;或者自己根据情况&#xff0c;更改编码格式 转载于:https://www.cnblogs.com/132818Creator…

操作系统原理之内存管理(第四章第一部分)

内存管理的⽬标&#xff1a;实现内存分配和回收&#xff0c;提高内存空间的利用率和内存的访问速度 一、存储器的层次结构 寄存器&#xff1a;在CPU内部有一组CPU寄存器&#xff0c;寄存器是cpu直接访问和处理的数据&#xff0c;是一个临时放数据的空间。 高速缓冲区&#xff1…

自写图片遮罩层放大功能jquery插件源代码,photobox.js 1.0版,不兼容IE6

版权声明&#xff1a;本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/u010480479/article/details/27362147 阿嚏~~~ 话说本屌丝没啥开发插件的经验&#xff0c;可是天公不作美&#xff0c;公司须要让我自己开发个图片放大的插件 但公司老大的话&#xff0…

黑白两客进入页面(1)

<div><span>欢</span><span>迎</span><span>来</span><span>到</span><span><strong>黑白两客</strong></span><span>的</span><span>博</span><span>客</sp…

zookeeper学习之原理

一、zookeeper 是什么 Zookeeper是一个分布式协调服务&#xff0c;可用于服务发现&#xff0c;分布式锁&#xff0c;分布式领导选举&#xff0c;配置管理等。这一切的基础&#xff0c;都是Zookeeper提供了一个类似于Linux文件系统的树形结构&#xff08;可认为是轻量级的内存文…

前端js基础智能机器人

<script>var flag true;while(flag) {//获取用户输入信息 var code prompt(你好,我是小娜\n请输入编号或者关键词选择功能,输入Q(q)退出聊天\n1.计算\n2.时间\n3.笑话);switch( code ) {case q:case Q:alert(狠心的抛弃了小娜);flag false;break;case 1:case 计算:var…

2018-2019-2 《Java程序设计》第6周学习总结

20175319 2018-2019-2 《Java程序设计》第6周学习总结 教材学习内容总结 本周学习《Java程序设计》第七章和第十章&#xff1a; 内部类&#xff1a; 1.内部类可以使用外嵌类的成员变量和方法。 2.类体中不可以声明类变量和类方法。 3.内部类仅供外嵌类使用。 4.类声明可以使用s…