第五節: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.pswp.cn/news/248212.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248212.shtml
英文地址,請注明出處:http://en.pswp.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 前景回…

JDBC Druid式link

準備工作&#xff1a;導入包------druid-1.0.9.jar src文件夾下放下druid.properties文件 且其中的url和數據庫名要配置完備 import JdbcUtils.JDBCUtils;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.PseudoColumnUsage;import java.sql…

vs strcore.cpp(156) 內存泄漏

在一個靜態函數的線程回調中&#xff0c;一個cstring的對象沒釋放。 遇到這種問題&#xff1a; 1、查看所有的指針對象&#xff0c;有沒有合適的回收 2、查看代碼的malloc&#xff0c;看看有沒有free 3、一點一點注釋代碼&#xff0c;定位位置 轉載于:https://www.cnblogs.com/…

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

webAPI 01-鍵盤事件 知識點-onkeydown事件[掌握] onkeydown: 當鍵盤上的鍵被按下時候觸發的一個事件知識點-onkeyup事件[掌握] onkeyup: 鍵盤上鍵彈起時候觸發的一個事件知識點-onkeypress事件[了解] onkeypress: 當鍵盤上的鍵被按下時候觸發的事件onkeydown 和 onkeypress的區…

【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…