.NET简谈事务、分布式事务处理

 

 

在本人的 .NET简谈事务本质论一文中我们从整体上了解了事务模型,在我们脑子里能有一个全局的事务处理结构,消除对数据库事务的依赖理解,重新认识事务编程模型。

今天这篇文章我们将使用.NET C#来进行事务性编程,从浅显、简单的本地事务开始,也就是我们用的最多的ADO.NET事务处理,然后我们逐渐扩大事务处理范围,包括对分布式事务处理的使用,多线程事务处理的使用。
数据库事务处理
数据库事务处理我们基本都很熟悉了,begin Transaction ……end Transaction,将要进行事务性的操作包在代码段里,为了便于文章有条理的讲解下去,我还是在这里穿插一个简单的小示例,便于与后面的代码进行对比分析。
1
我们在数据库里建两张表,也就是很简单一列信息。
表1名:test

 

表2名:test2

 

目的是为了掩饰事务的特性,所以我们这里给表1test的name列设置为主键,我们后面将通过有意的造成主键重复,导致事务自动回滚的效果。
我先来解释一下这两张表后面干什么用的。表test是用来有意造成事务内部处理出错用的,表test2是用来在事务处理当中扮演着没有错误的常规数据插入用的,我会在test2中先插入数据,然后在test中插入数据时触发事务内部执行错误导致事务回滚。
好了我们进行T-SQL的编写:
  1. insert into test values('222') --我们在表test中插入一条记录  
  2. go  
  3. begin transaction tr  
  4. begin try  
  5. begin 
  6. insert into test2 values('111')  
  7. insert into test values('222') --该行插入会导致主键冲突,也就是我们要的效果  
  8. end 
  9. commit transaction tr  
  10. end try  
  11. begin catch  
  12. print '事务执行错误!' 
  13. print error_number()  
  14. rollback transaction tr      
  15. end catch  
我们运行看看结果:

在事务处理过程中,很明显第一条插入语句执行成功了,但是由于第二条插入语句导致事务回滚所以数据是没有变化的。
这个示例可能过于简单,真正的企业级应用可能很复杂,但是我们的目的是看看事务的使用,越简单越明了越好。[王清培版权所有,转载请给出署名]
ADO.NET事务处理
下面我们将事务在.NET的AOD.NET中实现看看效果。

例2:

  1. public class Test  
  2.     {  
  3.         SqlConnection conn = new SqlConnection("data source=.;Initial Catalog=DataMedicine;Integrated Security=SSPI");  
  4.         public void Add()  
  5.         {  
  6.             conn.Open();  
  7.             SqlCommand command = new SqlCommand("insert into test2 values(111)", conn);  
  8.             try 
  9.             {  
  10.                 command.Transaction = conn.BeginTransaction();  
  11.                 command.ExecuteNonQuery();  
  12.                 command.CommandText = "insert into test values(222)";  
  13.                 command.ExecuteNonQuery();  
  14.                 command.Transaction.Commit();  
  15.             }  
  16.             catch (Exception err)  
  17.             {  
  18.                 Console.WriteLine(err);  
  19.                 command.Transaction.Rollback();  
  20.             }  
  21.         }  
  22.     }  
这就是典型ADO.NET事务处理代码,其实和我们第一个例子中的T-SQL代码是差不多的,通过ADO.NET中的SqlConnection.BeginTransaction()获取到对底层ODBC中的数据库事务的引用,其实这里还没有真正的设计到.NET中的事务处理代码,这里只是对数据库管理系统的远程调用,通过远程处理的消息通讯进行事务处理远程化。
事务信息显示类,为了便于观察事务的状态信息。
  1. public class DisplayTransactioninfo  
  2.     {  
  3.         public static void Display(System.Transactions.Transaction tr)  
  4.         {  
  5.             if (tr != null)  
  6.             {  
  7.                 Console.WriteLine("Createtime:" + tr.TransactionInformation.CreationTime);  
  8.                 Console.WriteLine("Status:" + tr.TransactionInformation.Status);  
  9.                 Console.WriteLine("Local ID:" + tr.TransactionInformation.LocalIdentifier);  
  10.                 Console.WriteLine("Distributed ID:" + tr.TransactionInformation.DistributedIdentifier);  
  11.                 Console.WriteLine();  
  12.             }  
  13.         }  
CommittableTransaction事务处理
从这里开始我们将接触到.NET中的事务处理,将了解到.NET中事务是怎样影响到远程数据库管理系统的事务处理的。
其实事务处理是一个非常复杂的技术领域,需要考虑很多可逆的技术实现,我们只是简单的了解原理和掌握基本的运用。
在我的 .NET简谈事务本质论一文中说到了事务的传递原理,那么事务传递意味着什么。其实事务传递的大概意思是将事务的执行范围通过网络传输的方式进行扩大到其他的机器上,比如我们在.NET中执行一项关于事务性的操作,那么在这个操作里面我们包含了对数据库的操作,这个时候对数据库的一系列操作都应该是属于事务范围内的,当事务回滚时还应该将数据库中的数据进行回滚才对。但是我们不可能总是显示的执行ADO.NET中的BeginTransaction,对于本地事务处理也就是单一资源管理器来说这也可以接受,那么如果在事务范围内涉及到多个资源管理器的操作,这就是分布式事务处理的范围了。所以说事务处理需要跨越网络传输形成无缝的面向服务的事务处理,数据库管理系统即有可能扮演者事务管理器的角色也有可能扮演着资源管理器的角色。太多的理论知识我这里就不多扯了,我们还是来看代码吧。
接着上面的实例,我们现在通过.NET中的事务处理来进行自动化的数据库事务处理。让数据库能自动的感知到我们正在进行事务性的操作。
3
我们利用Transaction类的子类CommittableTransaction可提交事务类来进行事务编程。
  1. public class Test3  
  2.     {  
  3.         SqlConnection conn;  
  4.         CommittableTransaction committran = new CommittableTransaction();  
  5.         public Test3()  
  6.         {  
  7.             conn = new SqlConnection("data source=.;Initial Catalog=DataMedicine;Integrated Security=SSPI");  
  8.             DisplayTransactioninfo.Display(committran);  
  9.         }  
  10.         public void Add3()  
  11.         {  
  12.             conn.Open();  
  13.             conn.EnlistTransaction(committran);//需要将本次的连接操作视为事务性的  
  14.             SqlCommand command = new SqlCommand();  
  15.             try 
  16.             {  
  17.                 command.Connection = conn;  
  18.                 command.CommandText = "insert into test2 values(111)";  
  19.                 command.ExecuteNonQuery();  
  20.                 command.CommandText = "insert into test values(222)";  
  21.                 command.ExecuteNonQuery();  
  22.                 committran.Commit();  
  23.             }  
  24.             catch (Exception err) { committran.Rollback(); //出现出错执行回滚操作}  
  25.         }  
  26.     }  
数据源连接对象代表着远程数据库资源,所以在执行操作之前我们需要将资源管理器添加到本地事务管理器中进行后期的投票、提交管理。
EnterpriseService(COM+)自动化事务处理
在.NET2.0中有一个程序集不是太被人重视,System.EnterpriseServices.dll,这个程序集是.NET中为了使用早起的COM+技术的托管程序集,我们可以使用这个程序集来编写一些我们以前所不能编写的COM+应用程序。至于COM+应用程序的介绍网上一大堆,随便搜搜就有好多资料了,我印象中有一篇是潘爱明潘老师写的一个文章蛮好的,就是介绍COM+的所有特性。
我们继续来事务处理,下面我们看看怎么借用System.EnterpriseServices.Transaction类来进行自动化的事务处理。
4
  1. [System.Runtime.InteropServices.ComVisible(true)]  
  2. //COM+是在COM的基础上发展起来的,需要将.NET程序集中的类型公开为COM组件。  
  3.     [System.EnterpriseServices.Transaction(TransactionOption.Required)]//始终需要事务处理域  
  4.     public class Test2 : ServicedComponent  
  5.     {  
  6.         public Test2() { }  
  7.         SqlConnection conn = new SqlConnection("data source=.;Initial Catalog=DataMedicine;Integrated Security=SSPI");  
  8.         [AutoComplete(true)]  
  9. //如果在方法的执行体类没有出现错误,那么将自动设置事务处理的结果  
  10.         public void Add2()  
  11.         {  
  12.             conn.Open();  
  13.             SqlCommand command = new SqlCommand();  
  14.             try 
  15.             {  
  16.                 command.Connection = conn;  
  17.                 command.CommandText = "insert into test2 values(111)";  
  18.                 command.ExecuteNonQuery();  
  19.                 command.CommandText = "insert into test values(222)";  
  20.                 command.ExecuteNonQuery();  
  21.             }  
  22.             catch { System.EnterpriseServices.ContextUtil.SetAbort(); }  
  23.         }  
  24.     }  
DependentTransaction跨线程事务处理
我们在编写高并发量程序时,都会用到多线程来进行处理,让主线程能有时间来处理第一线的请求,然后将请求分发到各个子线程上进行后台的处理。我们来看一幅图:

我们假设上面这幅图是我们系统的一个内部结构,主线程主要的任务就是接受外来的请求,然后将具体的任务完成放到一个到两个子线程中去完成,但是子线程与子线程之间没有必然的关系,由于事务的上下文是不夸线程的,那么怎么将两个或者更多的线程串在一个事务里。[王清培版权所有,转载请给出署名]
我们来看看依赖事务处理,看代码:
5
  1. public class Test6  
  2.     {  
  3.         CommittableTransaction commit = new CommittableTransaction();  
  4.         SqlConnection conn1 = new SqlConnection("data source=.;Initial Catalog=DataMedicine;Integrated Security=SSPI");  
  5.         public Test6()  
  6.         {  
  7.             conn1.Open();  
  8.             conn1.EnlistTransaction(commit);  
  9.         }  
  10.         public void Add6()  
  11.         {  
  12.             try 
  13.             {  
  14.                 DisplayTransactioninfo.Display(commit);  
  15.                 SqlCommand command = new SqlCommand("insert into test2 values(111)", conn1);  
  16.                 command.ExecuteNonQuery();  
  17.                 Thread thread = new Thread(Test6.CommitThread);  
  18.             thread.Start(commit.DependentClone(DependentCloneOption.BlockCommitUntilComplete));  
  19.                 commit.Commit();  
  20.             }  
  21.             catch (Exception err) { commit.Rollback(); }  
  22.         }  
  23.         public static void CommitThread(object co)  
  24.         {  
  25.             DependentTransaction commit = co as DependentTransaction;  
  26.             SqlConnection conn2 = new SqlConnection("data source=.;Initial Catalog=DataMedicine;Integrated Security=SSPI");  
  27.             conn2.Open();  
  28.             conn2.EnlistTransaction(commit as DependentTransaction);  
  29.             DisplayTransactioninfo.Display(commit);  
  30.             SqlCommand command = new SqlCommand("insert into test values(111)", conn2);  
  31.             try 
  32.             {  
  33.                 command.ExecuteNonQuery();  
  34.                 commit.Complete();  
  35.             }  
  36.             catch (Exception err) { Console.WriteLine(err); commit.Rollback(); }  
  37.         }  
  38.     }  
我们用一个子线程来执行另外的一个事务处理,由于是依赖事务处理,所以主事务处理完成后要等待子事务处理的结果。其实本例子已经是涉及到分布式事务处理的范围了,当事务范围内有一个以上的资源管理器时,本地事务管理器将自动提升为DTC管理器,下面我们来看看分布式事务处理。
DTC(Distributed Transaction Coordinator) 分布式事务处理
分布式事务在开发中经常是被用到,也必须被用到。必须同步数据、上下文更新等等。
按照使用方式的不同分布式事务的复杂程度也不同,基于本地事务的多资源管理器和基于SOA的面向服务的多资源管理器。
由于本地事务处理是基于本地事务管理器的,所以它不能管理分布式的事务,一旦当我们处理的事务范围要进行扩大时并且是夸机器的访问时,那么本地事务管理器将自动提升为分布式事务管理器也就是DTC(分布式事务协调器)。
6
  1. public class Test4  
  2.     {  
  3.         SqlConnection conn1 = new SqlConnection("data source=.;Initial Catalog=DataMedicine;Integrated Security=SSPI");  
  4.         SqlConnection conn2 = new SqlConnection("data source=.;Initial Catalog=DataMedicine;Integrated Security=SSPI");  
  5.         CommittableTransaction committran = new CommittableTransaction();  
  6.         public Test4()  
  7.         {  
  8.             DisplayTransactioninfo.Display(committran);  
  9.             conn1.Open();  
  10.             conn1.EnlistTransaction(committran);  
  11.             conn2.Open();  
  12.             conn2.EnlistTransaction(committran);  
  13.             DisplayTransactioninfo.Display(committran);  
  14.         }  
  15.         public void Add4()  
  16.         {  
  17.             try 
  18.             {  
  19.                 SqlCommand command1 = new SqlCommand("insert into test2 values(111)", conn1);  
  20.                 command1.ExecuteNonQuery();  
  21.                 SqlCommand command2 = new SqlCommand("insert into test values(222)", conn2);  
  22.                 command2.ExecuteNonQuery();  
  23.             }  
  24.             catch (Exception err) { Console.WriteLine(err); committran.Rollback(); }  
  25.         }  
  26.     }  
一旦我们开启分布式事务处理就能在我们的电脑上的DTC管理器上看见到。

 

但是要记得检查你的DTC服务是否开启了。

 

基于WCF框架的分布式事务处理
其实基于WCF框架进行分布式事务开发真的很轻松,它能很好的感知到当前上下文是不是事务域,并能很好的将事务序列化到服务这边来。但是设计一个高性能的分布式事务处理框架并非易事,需要很长时间的积累和实践。我们来看一下WCF是如果进行分布式事务处理的。
7
  1. //服务契约(ServiceContract):  
  2. [ServiceContract(SessionMode = SessionMode.Required)]  
  3.     public interface IDistributedTransaction  
  4.     {  
  5.         [TransactionFlow(TransactionFlowOption.Allowed)]  
  6.         [OperationContract]  
  7.         void Add();  
  8.     }  


 

  1. //服务类1:  
  2. public class DistributedTransactionService1 : IDistributedTransaction  
  3.     {  
  4.         SqlConnection conn1 = new SqlConnection("data source=.;Initial Catalog=DataMedicine;Integrated Security=SSPI");  
  5.         #region IDistributedTransaction  
  6.         [OperationBehavior(TransactionAutoComplete = true, TransactionScopeRequired = true)]  
  7.         public void Add()  
  8.         {  
  9.             conn1.Open();  
  10.             SqlCommand command = new SqlCommand("insert into test2 values(111)", conn1);  
  11.             command.ExecuteNonQuery();  
  12.             DataBaseOperation.DisplayTransactioninfo.Display(System.Transactions.Transaction.Current);  
  13.         }  
  14.         #endregion  
  15.     }  


 

  1. //服务类2:  
  2. public class DistributedTransactionService2 : IDistributedTransaction  
  3.     {  
  4.         SqlConnection conn2 = new SqlConnection("data source=.;Initial Catalog=DataMedicine;Integrated Security=SSPI");  
  5.         #region IDistributedTransaction  
  6.         [OperationBehavior(TransactionAutoComplete = true, TransactionScopeRequired = true)]  
  7.         public void Add()  
  8.         {  
  9.             conn2.Open();  
  10.             SqlCommand command = new SqlCommand("insert into test values(222)", conn2);  
  11.             try 
  12.             {  
  13.                 DataBaseOperation.DisplayTransactioninfo.Display(System.Transactions.Transaction.Current);  
  14.                 command.ExecuteNonQuery();  
  15.             }  
  16.             catch (Exception err) { throw err; }  
  17.         }  
  18.  

服务配置:

  1. <service name="ServerConsole.Transaction.DistributedTransactionService1" behaviorConfiguration="metadatabehaviors">  
  2.         <host>  
  3.           <baseAddresses>  
  4.             <add baseAddress="http://localhost:8027"/>  
  5.             <add baseAddress="net.tcp://localhost:8028"/>  
  6.           </baseAddresses>  
  7.         </host>  
  8.         <endpoint address="DistributedTransactionService1" binding="netTcpBinding" bindingConfiguration="tranbinding" 
  9.                    contract="ServerConsole.Transaction.IDistributedTransaction"></endpoint>  
  10.       </service>  
  11.       <service name="ServerConsole.Transaction.DistributedTransactionService2" behaviorConfiguration="metadatabehaviors">  
  12.         <host>  
  13.           <baseAddresses>  
  14.             <add baseAddress="http://localhost:8029"/>  
  15.             <add baseAddress="net.tcp://localhost:8030"/>  
  16.           </baseAddresses>  
  17.         </host>  
  18.         <endpoint address="DistributedTransactionService2" binding="netTcpBinding" bindingConfiguration="tranbinding" 
  19.                 contract="ServerConsole.Transaction.IDistributedTransaction"></endpoint>  
  20.       </service> 

Binding配置:

  1. <bindings>  
  2.       <netTcpBinding>  
  3.         <binding name="tranbinding" transactionFlow="true" transactionProtocol="WSAtomicTransactionOctober2004">  
  4.           <reliableSession enabled="true" ordered="true"/>  
  5.         </binding>  
  6.       </netTcpBinding>  
  7.     </bindings> 

我们需要打开Binding的事务流传递。

客户端代码:

  1. 客户端:  
  2. DistributedTransactionClient.DistributedTransactionClient tranclient = new DistributedTransactionClient.DistributedTransactionClient();  
  3.             DistributedTransaction2Client.DistributedTransactionClient tranclient2 = new DistributedTransaction2Client.DistributedTransactionClient();  
  4.             using (TransactionScope transcope = new TransactionScope())  
  5.             {  
  6.                 try 
  7.                 {  
  8.                     Transaction.Current.TransactionCompleted += new TransactionCompletedEventHandler(Current_TransactionCompleted);  
  9.                     tranclient.Add();  
  10.                     tranclient2.Add();  
  11.                     transcope.Complete();  
  12.                 }  
  13.                 catch (Exception err) { Transaction.Current.Rollback(); }  
  14.             }  
  15.  
  16. static void Current_TransactionCompleted(object sender, TransactionEventArgs e)  
  17.         {  
  18.             if (e.Transaction.TransactionInformation.Status ==  
  19.                 System.Transactions.TransactionStatus.Committed)  
  20.                 Console.WriteLine(e.Transaction.TransactionInformation.DistributedIdentifier);  
  21.         }  
客户端使用TransactionScope类来进行环境事务的设置,这样就很方便知道事务的执行范围,在TransactionScope里面我们可以通过Transaction.Current获取到当前上下文的事务对象,由于事务对象是存储在线程独立存储区里的,所以跨线程访问是没用的,通过依赖事务进行传递。
文章到这里就讲完了,从本地事务、多资源管理器分布式事务、SOA结构的分布式事务,我们都能进行基本的掌握。上面的例子都是经过严格测试的。

转载于:https://www.cnblogs.com/proxyz/p/6056654.html

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

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

相关文章

css compressor java_利用YUI Compressor压缩JS/CSS之终极秘籍

JS/CSS的压缩已经不是什么新鲜话题了&#xff0c;自打YSlow推出后&#xff0c;这方面的优化话题是铺天盖地啊&#xff1b;不过当时作为后知后觉的我&#xff0c;甚至都没法完整地写出一份漂亮的JS/CSS的代码&#xff0c;何尝会去注意呢&#xff1f;&#xff01;时至今日&#x…

HTML 列表中的dl,dt,dd,ul,li,ol区别及应用

HTML 列表中的dl,dt,dd,ul,li,ol区别及应用 HTML 列表中的dl,dt,dd,ul,li,ol区别及应用 工具/原料 html&#xff0c;dw软件方法/步骤 1无序列表 无序列表是一个项目的列表&#xff0c;此列项目使用粗体圆点&#xff08;典型的小黑圆圈&#xff09;进行标记。 无序列表始于 <…

自然语言10_分类与标注

sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare http://www.tuicool.com/articles/feAfi2 NLTK读书笔记 — …

git中Please enter a commit message to explain why this merge is necessary.

Please enter a commit message to explain why this merge is necessary. 请输入提交消息来解释为什么这种合并是必要的 git 在pull或者合并分支的时候有时会遇到这个界面。可以不管(直接下面3,4步)&#xff0c;如果要输入解释的话就需要: 1.按键盘字母 i 进入insert模式 2.修…

abp框架mysql连接配置,abp框架连接数据库

ABP框架搭建项目系列教程基础版完结篇经过前面十二篇的基础教程&#xff0c;现在终于该做个总结了。回顾第一篇&#xff0c;我们建议新手朋友们先通过ABP官网的启动模板生成解决方案&#xff0c;因为这样既快速又准确&#xff0c;不会因为项目的搭建&#xff0c;而让新手畏而却…

【分布式】Zookeeper在大型分布式系统中的应用

一、前言 上一篇博文讲解了Zookeeper的典型应用场景&#xff0c;在大数据时代&#xff0c;各种分布式系统层出不穷&#xff0c;其中&#xff0c;有很多系统都直接或间接使用了Zookeeper&#xff0c;用来解决诸如配置管理、分布式通知/协调、集群管理和Master选举等一系列分布式…

Egret资源管理解决方案

关于egret开发H5页游&#xff0c;资源管理和加载的一点看法。 一 多json文件管理 二 资源归类和命名 三 exml文件编写规范 四 资源预加载、分步加载、偷载 五 资源文件group分组 六 ResUtils&#xff0c;多json文件管理类 七 ResUtils&#xff0c;资源组加载管理类 八 开发中遇…

java 等待唤醒机制,Java线程等待唤醒机制

记录面试过程中被问到的几个需要手写代码的小案例1.请手写出线程的等待唤醒机制案例中两个线程&#xff1a;SyncSetThread设置学生信息&#xff0c;SyncGetThread用来获取学生信息&#xff0c;在Student实体中提供一个标记属性flag&#xff0c;记录当前是否有数据。等待唤醒机制…

Xshell实现Windows上传文件到Linux主机

经常有这样的需求&#xff0c;我们在Windows下载的软件包&#xff0c;如何上传到远程Linux主机上&#xff1f;还有如何从Linux主机下载软件包到Windows下&#xff1b;之前我的做法现在看来好笨好繁琐&#xff0c;不过也达到了目的&#xff0c;笨人有本方法嘛&#xff1b; 我是怎…

织梦自适应php源码,DEDE织梦PHP源码响应式建筑设计类网站织梦模板(自适应手机端)...

模板名称&#xff1a;响应式建筑设计类网站织梦模板(自适应移动端) 利于SEO优化模板详情&#xff1a;织梦最新内核开发的模板&#xff0c;该模板属于企业通用、HTML5响应式、建筑设计类企业使用&#xff0c;一款适用性很强的模板&#xff0c;基本可以适合各行业的企业网站&…

mac本用WTG(Windows To Go)安装Win10到移动硬盘

准备工作&#xff1a; 一个空的 USB 3.0 移动硬盘&#xff08;在安装 WTG 时候会将这个硬盘清空重新并分区&#xff0c;注意备份好数据。USB 3.0 的优盘是不行的&#xff0c;即使安装成功&#xff0c;系统的运行速度会奇慢&#xff09; 原版Windows 10 安装镜像&#xff08;建议…

js初步简单的编程代码

简单图片切换编码demo图片地址自行替换 简单图片切换编码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml" …

安卓文本编辑器php cpp,开源的Android富文本编辑器

RichEditor基于原生EditTextspan实现的Android富文本编辑器github地址&#xff1a;https://github.com/yuruiyin/RichEditor组件描述该组件是基于原生EditTextspan的方式实现的&#xff0c;旨在提供一个功能齐全且使用方便的Android富文本编辑器。主要支持了加粗斜体等行内样式…

python gif 透明,Python3+试点批量处理简单的GIF到PNG并透明地去除背景色,python3Pillow,gif,转成,png,透明化,去掉...

1. 安装Pillow, 只用这个应该也可以&#xff0c;2. 安装 cImage下载后解压&#xff0c;拷贝image.py到你python安装目录的 Lib\site-packages 中。from PIL import Imageimport osimport imagedef get_imlist(path):"""返回目录中所有gif图像的文件名列表图像的…

matlab求半衰期,如何使用GLD和GDX价差来估计均值回归的半衰期

计算均值回归时间序列的半衰期我们可以通过例中GLD和GDX的均值回归差价来计算均值回归半衰期。MATLAB代码可以从epchan. com/book/example? _ 5. m获得。(这个程序的第一部分与example7 2. m.相同。)%在此播入example7_2. m%Insert example7 2. m in the beginning hereprevzb…

框架错误汇总

1.struts标签&#xff0c;在body中输入代码发现值栈不存在&#xff0c; 即<s:debug></s:debug>没有起作用 1 <body>2 3 4 测试url标签<br>5 <s:url value"index.jsp" var"surl"></s:url><br>6 <s:url value&…

初次进入oracle数据库,Oracle数据库的初次使用

oracle数据库的初次使用&#xff1a;oracle自带了用户 system /system管理员用户 scott/tiger用户初次使用&#xff1a;创建表空间(此处为使用默认的用户scott/tiger)在控制台&#xff1a;1.使用system/system用户登录语句&#xff1a;sqlplus system/system2.赋予用户权限&…

oracle+循环插入sql,SQL server,Oracle循环插入百万数据

SQL server&#xff0c;Oracle循环插入百万数据SQL server&#xff0c;Oracle循环插入百万数据压测时常需要往数据库插入大量数据&#xff0c;下面是我往两个数据库插入数据时用的脚本declare maxSum int,lid nvarchar(64), -- lid为表idcid int,userid nvarchar(64),oper_time…

jquery 通过submit()方法 提交表单示例

jquery 通过submit()方法 提交表单示例&#xff1a; 本示例&#xff1a;以用户注册作为例子。使用jquery中的submit()方法实现表单提交。 注&#xff1a;本示例仅提供了对表单的验证&#xff0c;本例只用选用了三个字段作为测试。 用户点击提交按钮时&#xff0c;触发点击事件&…

php background-image,css background-image属性怎么用

css background-image属性为元素设置背景图像&#xff0c;语法为&#xff1a;background-image:url(图片路径)。设置的背景图像会占据元素的全部尺寸&#xff0c;包括内边距和边框&#xff0c;但不包括外边距。css background-image属性怎么用&#xff1f;作用&#xff1a;为元…