化零為整WCF(14) - 事務(Transaction)

[索引頁]
[源碼下載]?


化零為整WCF(14) - 事務(Transaction)


作者:webabcd


介紹
WCF(Windows Communication Foundation) - 事務(Transaction):
??? ·對契約方法使用TransactionFlowAttribute聲明(設置TransactionFlowOption參數),以指定服務操作的事務流策略
??? ·對服務方法是用OperationBehaviorAttribute聲明(設置TransactionScopeRequired參數),以指定方法是否在事務范圍(TransactionScope)內執行
??? ·配置host和client的binding節點的transactionFlow屬性,以指定綁定是否支持流事務


示例
1、服務
Hello.cs
InBlock.gifusing?System;?
InBlock.gifusing?System.Collections.Generic;?
InBlock.gifusing?System.Linq;?
InBlock.gifusing?System.Text;?
InBlock.gif?
InBlock.gifusing?System.ServiceModel;?
InBlock.gif?
InBlock.gifnamespace?WCF.ServiceLib.Transaction?
InBlock.gif{?
InBlock.gif????????/// <summary>?
InBlock.gif????????///?IHello接口?
InBlock.gif????????/// </summary>?
InBlock.gif????????[ServiceContract]?
InBlock.gif????????public?interface?IHello?
InBlock.gif????????{?
InBlock.gif????????????????/// <summary>?
InBlock.gif????????????????///?打招呼方法?
InBlock.gif????????????????/// </summary>?
InBlock.gif????????????????/// <param name="name">人名</param>?
InBlock.gif????????????????/// <remarks>?
InBlock.gif????????????????/// TransactionFlow - 指定服務操作是否愿意接受來自客戶端的傳入事務?
InBlock.gif????????????????/// NotAllowed - 禁止事務。默認值?
InBlock.gif????????????????/// Allowed - 允許事務?
InBlock.gif????????????????/// Mandatory - 強制事務?
InBlock.gif????????????????///?</remarks>?

InBlock.gif????????????????/// <returns></returns>?
InBlock.gif????????????????[OperationContract]?
InBlock.gif????????????????[TransactionFlow(TransactionFlowOption.Mandatory)]?
InBlock.gif????????????????void?WriteHello(string?name);?
InBlock.gif????????}?
InBlock.gif?
InBlock.gif????????/// <summary>?
InBlock.gif????????///?Hello類?
InBlock.gif????????/// </summary>?
InBlock.gif????????public?class?Hello : IHello?
InBlock.gif????????{?
InBlock.gif????????????????/// <summary>?
InBlock.gif????????????????///?打招呼方法?
InBlock.gif????????????????/// </summary>?
InBlock.gif????????????????/// <param name="name">人名</param>?
InBlock.gif????????????????/// <remarks>?
InBlock.gif????????????????/// OperationBehavior - 指定服務方法的本地執行行為?
InBlock.gif????????????????/// 1、TransactionScopeRequired - 如果方法需要事務范圍才能執行,則為?true;否則為?false。默認值為false?
InBlock.gif????????????????/// 將 TransactionScopeRequired 設置為?true,可以要求操作在事務范圍內執行。如果流事務可用,則操作會在該事務內執行。如果流事務不可用,則會創建一個新事務并使用它來執行操作?
InBlock.gif????????????????/// 2、TransactionAutoComplete - 默認值為?true?
InBlock.gif????????????????///?true?- 當方法完成執行時,將把該事務標志為完成(自動提交事務)?
InBlock.gif????????????????///?false?- 需要調用OperationContext.Current.SetTransactionComplete()方法來手工配置該事務的正確完成;否則,該事務將被標志為失敗(手動提交事務)?
InBlock.gif????????????????///?</remarks>?

InBlock.gif????????????????/// <returns></returns>?
InBlock.gif????????????????[OperationBehavior(TransactionScopeRequired =?true, TransactionAutoComplete =?true)]?
InBlock.gif????????????????public?void?WriteHello(string?name)?
InBlock.gif????????????????{?
InBlock.gif????????????????????????DBDataContext ctx =?new?DBDataContext();?
InBlock.gif?
InBlock.gif????????????????????????ctx.Items.InsertOnSubmit(?
InBlock.gif????????????????????????????????new?Item?
InBlock.gif????????????????????????????????{?
InBlock.gif????????????????????????????????????????Title =?string.Format("Hello: {0}, TransactionId: {1}", name, System.Transactions.Transaction.Current.TransactionInformation.LocalIdentifier),?
InBlock.gif????????????????????????????????????????CreatedTime = DateTime.Now?
InBlock.gif????????????????????????????????});?
InBlock.gif?
InBlock.gif????????????????????????ctx.SubmitChanges();?
InBlock.gif????????????????}?
InBlock.gif????????}?
InBlock.gif}
Hi.cs
InBlock.gifusing?System;?
InBlock.gifusing?System.Collections.Generic;?
InBlock.gifusing?System.Linq;?
InBlock.gifusing?System.Text;?
InBlock.gif?
InBlock.gifusing?System.ServiceModel;?
InBlock.gif?
InBlock.gifnamespace?WCF.ServiceLib.Transaction?
InBlock.gif{?
InBlock.gif????????/// <summary>?
InBlock.gif????????///?IHi接口?
InBlock.gif????????/// </summary>?
InBlock.gif????????[ServiceContract]?
InBlock.gif????????public?interface?IHi?
InBlock.gif????????{?
InBlock.gif????????????????/// <summary>?
InBlock.gif????????????????///?打招呼方法?
InBlock.gif????????????????/// </summary>?
InBlock.gif????????????????/// <param name="name">人名</param>?
InBlock.gif????????????????/// <returns></returns>?
InBlock.gif????????????????[OperationContract]?
InBlock.gif????????????????[TransactionFlow(TransactionFlowOption.Mandatory)]?
InBlock.gif????????????????void?WriteHi(string?name);?
InBlock.gif????????}?
InBlock.gif?
InBlock.gif????????/// <summary>?
InBlock.gif????????///?Hi類?
InBlock.gif????????/// </summary>?
InBlock.gif????????public?class?Hi : IHi?
InBlock.gif????????{?
InBlock.gif????????????????/// <summary>?
InBlock.gif????????????????///?打招呼方法?
InBlock.gif????????????????/// </summary>?
InBlock.gif????????????????/// <param name="name">人名</param>?
InBlock.gif????????????????/// <returns></returns>?
InBlock.gif????????????????[OperationBehavior(TransactionScopeRequired =?true, TransactionAutoComplete =?true)]?
InBlock.gif????????????????public?void?WriteHi(string?name)?
InBlock.gif????????????????{?
InBlock.gif????????????????????????if?(DateTime.Now.Second % 2 == 0)?
InBlock.gif????????????????????????????????throw?new?System.Exception("為測試事務而拋出的異常");?
InBlock.gif?
InBlock.gif????????????????????????DBDataContext ctx =?new?DBDataContext();?
InBlock.gif?
InBlock.gif????????????????????????ctx.Items.InsertOnSubmit(?
InBlock.gif????????????????????????????????new?Item?
InBlock.gif????????????????????????????????{?
InBlock.gif????????????????????????????????????????Title =?string.Format("Hi: {0}, TransactionId: {1}", name, System.Transactions.Transaction.Current.TransactionInformation.LocalIdentifier),?
InBlock.gif????????????????????????????????????????CreatedTime = DateTime.Now?
InBlock.gif????????????????????????????????});?
InBlock.gif?
InBlock.gif????????????????????????ctx.SubmitChanges();?
InBlock.gif????????????????}?
InBlock.gif????????}?
InBlock.gif}
Result.cs
InBlock.gifusing?System;?
InBlock.gifusing?System.Collections.Generic;?
InBlock.gifusing?System.Linq;?
InBlock.gifusing?System.Text;?
InBlock.gif?
InBlock.gifusing?System.ServiceModel;?
InBlock.gif?
InBlock.gifnamespace?WCF.ServiceLib.Transaction?
InBlock.gif{?
InBlock.gif????????/// <summary>?
InBlock.gif????????///?結果接口?
InBlock.gif????????/// </summary>?
InBlock.gif????????[ServiceContract]?
InBlock.gif????????public?interface?IResult?
InBlock.gif????????{?
InBlock.gif????????????????[OperationContract]?
InBlock.gif????????????????List<Item> GetResult();?
InBlock.gif????????}?
InBlock.gif?
InBlock.gif????????/// <summary>?
InBlock.gif????????///?結果類?
InBlock.gif????????/// </summary>?
InBlock.gif????????public?class?Result : IResult?
InBlock.gif????????{?
InBlock.gif????????????????/// <summary>?
InBlock.gif????????????????///?返回數據庫結果?
InBlock.gif????????????????/// </summary>?
InBlock.gif????????????????/// <returns></returns>?
InBlock.gif????????????????public?List<Item> GetResult()?
InBlock.gif????????????????{?
InBlock.gif????????????????????????DBDataContext ctx =?new?DBDataContext();?
InBlock.gif?
InBlock.gif????????????????????????var result = from l?in?ctx.Items?
InBlock.gif???????????????????????????????????????????????? orderby l.CreatedTime descending?
InBlock.gif???????????????????????????????????????????????? select l;?
InBlock.gif?
InBlock.gif????????????????????????return?result.ToList();?
InBlock.gif????????????????}?
InBlock.gif????????}?
InBlock.gif}

2、宿主
Hello.svc
<%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Transaction.Hello" %>
Hi.svc
<%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Transaction.Hi" %>
Result.svc
<%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Transaction.Result" %>
Web.config
<?xml version="1.0"?>?
<configuration>?
????????<system.serviceModel>?
????????????????<behaviors>?
????????????????????????<serviceBehaviors>?
????????????????????????????????<behavior name="TransactionBehavior">?
????????????????????????????????????????<!--httpGetEnabled - 指示是否發布服務元數據以便使用 HTTP/GET 請求進行檢索,如果發布 WSDL,則為 true,否則為 false,默認值為 false-->?
????????????????????????????????????????<serviceMetadata httpGetEnabled="true" />?
????????????????????????????????????????<serviceDebug includeExceptionDetailInFaults="true"/>?
????????????????????????????????</behavior>?
????????????????????????</serviceBehaviors>?
????????????????</behaviors>?
????????????????<services>?
????????????????????????<!--name - 提供服務的類名-->?
????????????????????????<!--behaviorConfiguration - 指定相關的行為配置-->?
????????????????????????<service name="WCF.ServiceLib.Transaction.Hello" behaviorConfiguration="TransactionBehavior">?
????????????????????????????????<!--address - 服務地址-->?
????????????????????????????????<!--binding - 通信方式-->?
????????????????????????????????<!--contract - 服務契約-->?
????????????????????????????????<!--bindingConfiguration - 指定相關的綁定配置-->?
????????????????????????????????<endpoint address="" binding="wsHttpBinding" contract="WCF.ServiceLib.Transaction.IHello" bindingConfiguration="TransactionConfiguration" />?
????????????????????????</service>?
????????????????????????<service name="WCF.ServiceLib.Transaction.Hi" behaviorConfiguration="TransactionBehavior">?
????????????????????????????????<endpoint address="" binding="wsHttpBinding" contract="WCF.ServiceLib.Transaction.IHi" bindingConfiguration="TransactionConfiguration" />?
????????????????????????</service>?
????????????????????????<service name="WCF.ServiceLib.Transaction.Result" behaviorConfiguration="TransactionBehavior">?
????????????????????????????????<endpoint address="" binding="basicHttpBinding" contract="WCF.ServiceLib.Transaction.IResult" />?
????????????????????????</service>?
????????????????</services>?
????????????????<bindings>?
????????????????????????<wsHttpBinding>?
????????????????????????????????<!--transactionFlow - 指定該綁定是否應支持流事務-->?
????????????????????????????????<binding name="TransactionConfiguration" transactionFlow="true" />?
????????????????????????</wsHttpBinding>?
????????????????</bindings>?
????????</system.serviceModel>?
</configuration>
3、客戶端
Sample.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Sample.aspx.cs"?
????????Inherits="Transaction_Sample" Title="事務(Transaction)" %>?

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">?
</asp:Content>?
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">?
????????<p>?
????????????????<asp:Label ID="lblErr" runat="server" ForeColor="Red" />?
????????</p>?
????????<p>?
????????????????<asp:Button ID="btnSubmit" runat="server" Text="事務測試" OnClick="btnSubmit_Click" />?
????????????????<br />?
????????????????<br />?
????????????????<asp:GridView ID="GridView1" runat="server">?
????????????????</asp:GridView>?
????????</p>?
????????<p>?
????????????????2PC(Two Phase Commitment Protocol)兩階段提交協議(WCF的事務的實現基于此協議)?
????????????????<br />?
????????????????實現分布式事務的關鍵就是兩階段提交協議。在此協議中,一個或多個資源管理器的活動均由一個稱為事務協調器的單獨軟件組件來控制。此協議中的五個步驟如下:?
????????????????<br />?
????????????????1、應用程序調用事務協調器中的提交方法。?
????????????????<br />?
????????????????2、事務協調器將聯絡事務中涉及的每個資源管理器,并通知它們準備提交事務(這是第一階段的開始)。?
????????????????<br />?
????????????????3、為 了以肯定的方式響應準備階段,資源管理器必須將自己置于以下狀態:確保能在被要求提交事務時提交事務,或在被要求回滾事務時回滾事務。大多數資源管理器會將包含其計劃更改的日記文件(或等效文件)寫入持久存儲區中。如果資源管理器無法準備事務,它會以一個否定響應來回應事務協調器。?
????????????????<br />?
????????????????4、事務協調器收集來自資源管理器的所有響應。?
????????????????<br />?
????????????????5、在 第二階段,事務協調器將事務的結果通知給每個資源管理器。如果任一資源管理器做出否定響應,則事務協調器會將一個回滾命令發送給事務中涉及的所有資源管理 器。如果資源管理器都做出肯定響應,則事務協調器會指示所有的資源管理器提交事務。一旦通知資源管理器提交,此后的事務就不能失敗了。通過以肯定的方式響應第一階段,每個資源管理器均已確保,如果以后通知它提交事務,則事務不會失敗。?
????????</p>?
</asp:Content>
Sample.aspx.cs
InBlock.gifusing?System;?
InBlock.gifusing?System.Collections;?
InBlock.gifusing?System.Configuration;?
InBlock.gifusing?System.Data;?
InBlock.gifusing?System.Linq;?
InBlock.gifusing?System.Web;?
InBlock.gifusing?System.Web.Security;?
InBlock.gifusing?System.Web.UI;?
InBlock.gifusing?System.Web.UI.HtmlControls;?
InBlock.gifusing?System.Web.UI.WebControls;?
InBlock.gifusing?System.Web.UI.WebControls.WebParts;?
InBlock.gifusing?System.Xml.Linq;?
InBlock.gif?
InBlock.gifusing?System.Threading;?
InBlock.gif?
InBlock.gifpublic?partial?class?Transaction_Sample : System.Web.UI.Page?
InBlock.gif{?
InBlock.gif????????protected?void?Page_Load(object?sender, EventArgs e)?
InBlock.gif????????{?
InBlock.gif?
InBlock.gif????????}?
InBlock.gif?
InBlock.gif????????protected?void?btnSubmit_Click(object?sender, EventArgs e)?
InBlock.gif????????{?
InBlock.gif????????????????var proxyHello =?new?TransactionSvc.Hello.HelloClient();?
InBlock.gif????????????????var proxyHi =?new?TransactionSvc.Hi.HiClient();?
InBlock.gif????????????????var proxyResult =?new?TransactionSvc.Result.ResultClient();?
InBlock.gif?
InBlock.gif????????????????System.Transactions.TransactionOptions to =?new?System.Transactions.TransactionOptions();?
InBlock.gif????????????????// 設置事務的超時時間?
InBlock.gif????????????????to.Timeout =?new?TimeSpan(0, 0, 30);?
InBlock.gif????????????????// 設置事務的隔離級別?
InBlock.gif????????????????to.IsolationLevel = System.Transactions.IsolationLevel.Serializable;?
InBlock.gif?
InBlock.gif????????????????using?(var ts =?new?System.Transactions.TransactionScope())?
InBlock.gif????????????????{?
InBlock.gif????????????????????????try?
InBlock.gif????????????????????????{?
InBlock.gif????????????????????????????????proxyHello.WriteHello("webabcd");?
InBlock.gif????????????????????????????????proxyHello.Close();?
InBlock.gif?
InBlock.gif????????????????????????????????proxyHi.WriteHi("webabcd");?
InBlock.gif????????????????????????????????proxyHi.Close();?
InBlock.gif?
InBlock.gif????????????????????????????????ts.Complete();?
InBlock.gif?
InBlock.gif????????????????????????????????lblErr.Text =?"OK";?
InBlock.gif????????????????????????}?
InBlock.gif????????????????????????catch?(Exception ex)?
InBlock.gif????????????????????????{?
InBlock.gif????????????????????????????????lblErr.Text = ex.ToString();?
InBlock.gif????????????????????????}?
InBlock.gif????????????????}?
InBlock.gif?
InBlock.gif????????????????GridView1.DataSource = proxyResult.GetResult();?
InBlock.gif????????????????GridView1.DataBind();?
InBlock.gif????????????????proxyHello.Close();?
InBlock.gif????????}?
InBlock.gif}
Web.config
<?xml version="1.0"?>?
<configuration>?
????????<system.serviceModel>?
????????????????<client>?
????????????????????????<!--address - 服務地址-->?
????????????????????????<!--binding - 通信方式-->?
????????????????????????<!--contract - 服務契約-->?
????????????????????????<endpoint address="http://localhost:3502/ServiceHost/Transaction/Hello.svc" binding="wsHttpBinding" contract="TransactionSvc.Hello.IHello" bindingConfiguration="TransactionBindingConfiguration" />?
????????????????????????<endpoint address="http://localhost:3502/ServiceHost/Transaction/Hi.svc" binding="wsHttpBinding" contract="TransactionSvc.Hi.IHi" bindingConfiguration="TransactionBindingConfiguration" />?
????????????????????????<endpoint address="http://localhost:3502/ServiceHost/Transaction/Result.svc" binding="basicHttpBinding" contract="TransactionSvc.Result.IResult" />?
????????????????</client>?
????????????????<bindings>?
????????????????????????<wsHttpBinding>?
????????????????????????????????<!--transactionFlow - 指定該綁定是否應支持流事務-->?
????????????????????????????????<binding name="TransactionBindingConfiguration" transactionFlow="true" />?
????????????????????????</wsHttpBinding>?
????????????????</bindings>?
????????</system.serviceModel>?
</configuration>
運行結果:
單擊"btnSubmit"按鈕后,可以發現,兩個數據庫插入操作,要么都執行,要么都不執行


OK
[源碼下載]
?

本文轉自webabcd 51CTO博客,原文鏈接:http://blog.51cto.com/webabcd/344160,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257050.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257050.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257050.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

有限元分析筆記01-平面應力和平面應變

https://www.zhihu.com/question/30439292 http://blog.sina.cn/dpool/blog/s/blog_c4c804690102vqqs.html plate stress plate strain

MQTT-SN協議亂翻之實現要點

前言 本篇是MQTT-SN 1.2協議最后一篇翻譯了&#xff0c;主要涉及實現要點&#xff0c;很簡短。 需要支持QoS 值為 -1 QoS雖默認設置有0,1,2三個值&#xff0c;但還有一種情況其值為-1。來自客戶端的PUBLISH消息中若QoS為-1的情況下&#xff0c;此刻客戶端不會關心和網關有沒有建…

oracle-REDO日志文件分析(insert)

1:記錄當前scnselect dbms_flashback.get_system_change_number from dual;GET_SYSTEM_CHANGE_NUMBER------------------------11595722:創建表CREATE TABLE team (team_code VARCHAR2(3),team_name VARCHAR2(30),country_code VARCHAR2(3) );INSERT INTO team VALUES (M…

刪除修改bond

參考地址&#xff1a;http://www.111cn.net/sys/linux/79301.htm 四、刪除bonding設備 如由于最初配置的bonding設備取名為bond0&#xff0c;而后改名為了bond1&#xff0c;造成了兩個bonding設備的存在&#xff0c;現在需刪除bond0 。先查看下網絡設備&#xff1a; # ls /sys/…

學習筆記(18):Python網絡編程并發編程-守護進程

立即學習:https://edu.csdn.net/course/play/24458/296429?utm_sourceblogtoedu 守護進程&#xff08;了解&#xff09; 1.概念&#xff1a;守護進程是主進程在創建子進程的時候&#xff0c;將子進程設置成守護自己的進程&#xff0c;等主進程結束后&#xff0c;不管子進程的…

靜態頁面之間的轉發與json與ajax做到動態數據

我們見過很多使用jsp ,php,asp的動態網頁技術的網站了,我們知道如果一個網站內容更新頻率極低,而內容量不是十分龐大時,這樣的網站(一次開發完成后不會需要較多的維護成本)的完全可以使用全部使用靜態頁面來做,此時其實反而可以得到更好的效果(更快的響應時間(省掉了服務器各種…

數組的最后一位的下一位為什么是0?

以下是我做的兩個實驗&#xff0c;加證實了數組的最后一位的后一位是0&#xff0c;只應該是系統自動添加的標志位 1、比如 int a[5] 則a[5]0,這個是什么原因我還沒有搞懂 #include<iostream> using namespace std;int main() {int a[5];int *pa;for(int i0;i<5;i){a[i…

iOS開發網絡篇—NSURLConnection基本使用

iOS開發網絡篇—NSURLConnection基本使用 一、NSURLConnection的常用類 &#xff08;1&#xff09;NSURL&#xff1a;請求地址 &#xff08;2&#xff09;NSURLRequest&#xff1a;封裝一個請求&#xff0c;保存發給服務器的全部數據&#xff0c;包括一個NSURL對象&#xff0c;…

如何查看mysql連接相關參數

1.查看當前所有連接的詳細資料: mysqladmin -u root -ppassword processlist 這里password為數據庫用戶root的密碼 2.只查看當前連接數(Threads就是連接數.): mysqladmin -u root -ppassword status 這里password為數據庫用戶root的密碼 3.如何知道當前MySQL設置的并發連接數是…

學習筆記(19):Python網絡編程并發編程-互斥鎖

立即學習:https://edu.csdn.net/course/play/24458/296430?utm_sourceblogtoedu 1.互斥鎖&#xff1a; 多進程間的內存是相互隔離的&#xff0c;因此其數據也是相互隔離的&#xff0c;但是所有的進程都共享一個文件操作系統或者說共享文件處理器和打印端。而共享帶來的是競爭…

使用HTML5+CSS3制作圓角內發光按鈕----示例

<!doctype html> <html> <head> <meta charset"utf-8" /> <title>制作漂亮的圓角按鈕<title> <style type"text/css"> .loginBtnDiv { float:right; padding-right:50px; padding-top:10px; } .loginBtn, .Resg…

C++中的sort()函數的原形

1、sor(a,an,compare) {//前兩個是參數是待排序的數組首地址和尾地址 //最后一個參數是compare表示的比較類型 //可調用functional函數的less&#xff08;&#xff09;和greater&#xff08;&#xff09;函數比較大小}

鼠標放上超鏈接顯示背景效果

鼠標放上超鏈接顯示背景效果&#xff1a; <html> <head> <style type"text/css"> a.one:link {color: #ff0000} a.one:visited {color: #0000ff} a.one:hover {color: #ffcc00}a.two:link {color: #ff0000} a.two:visited {color: #0000ff} a.two:…

學習筆記(20):Python網絡編程并發編程-互斥鎖與join的區別

立即學習:https://edu.csdn.net/course/play/24458/296432?utm_sourceblogtoedu 互斥鎖與join的異同&#xff1a; 1.同&#xff1a;都是將多進程并發模式變成多進程串行&#xff0c;保證了數據的有序性 2.異&#xff1a; 互斥鎖只是對于進程的局部代碼實施串行執行變化&#x…

Kali滲透(二)之被動信息收集

被動信息收集 公開渠道可獲得的信息 與目標系統不產生直接交互 盡量避免留下一切痕跡 下面是兩個關于開源情報&#xff08;OSINT&#xff09;的書籍 美國軍方 北大西洋公約組織 信息收集內容 一.IP地址段與域名信息 二.郵件地址 三.文檔圖片數據 四.公司地址 五.公司組織…

ccBPM典型的樹形表單和多表頭表單的流程示例

ccBPM典型的樹形表單和多表頭表單的流程 關鍵字&#xff1a;樹形表單。ccBPM支持樹形表單&#xff0c;也可以稱之為樹結構的多表單或者多表頭表單。 應用場景&#xff1a;比如項目招標類流程&#xff0c;在填寫項目申請的環節&#xff0c;需要填寫公司簡介、公司業績、項目實施…

由strcat函數引發的對char *a和char a[]以及sizeof和strlen

/* http://www.cnblogs.com/kaituorensheng/archive/2012/10/23/2736069.html參考這篇文章* char *a "Hello";Hello存放在常量區&#xff0c;是無法修改的。 * 通過指針只可以訪問字符串常量&#xff0c;而不可以去改變它 * * * char a[] "Hello";…

for(;;)函數中判斷條件執行順序

for(i100;i>0&#xff1b;--i) { cout<<"i"<<i<<endl; } 它的執行過程如下&#xff1a; 1) 先求解表達式1。 2) 求解表達式2&#xff0c;若其值為真&#xff08;非0&#xff09;&#xff0c;則執行for語句中指定的內嵌語句&…

學習筆記(21):Python網絡編程并發編程-隊列的使用

立即學習:https://edu.csdn.net/course/play/24458/296433?utm_sourceblogtoedu 隊列和管道 1.存在的意義&#xff1a; 1&#xff09;在前面的筆記中&#xff0c;使用join和互斥鎖來保證了硬盤數據共享的數據安全性&#xff0c;但是降低了代碼的運行效率&#xff1b; 2&#x…

dbms_xplan之display_cursor函數的使用

文章來源&#xff1a;http://blog.csdn.net/leshami/article/details/6866925 DBMS_XPLAN包中display_cursor函數不同于display函數&#xff0c;display_cursor用于顯示SQL語句的真實的執行計劃&#xff0c;在大多數情況下&#xff0c;顯示真實 的執行計劃有助于更好的分析SQL語…