zoukankan      html  css  js  c++  java
  • 事务和异常处理

    事务将控制和维护数据库的一致性和完整性(出错不会对数据库作修改)。应用中包含的事务应当尽量让它“瞬间”完成,避免在比较忙时造成用户进程的互锁

    事务处理过程

     A。事务待命:开始一个事务
     B。事务日志:记录事务中改变的数据记录。不直接改变数据库中的值,而是用一个顺序的“事务日志”记录在一边。同时,对于要改变的原始记录加锁,让其它用户无法读和写。如果记录已经被其它事务加锁,则报错。
     C。事务拷贝:Commit Transaction,拷贝所有加锁的记录成备份。
     D。事务更新:用“事务日志”中的记录一一更新实际的数据库记录。
     E。事务结束:释放所有的记录锁,然后抛弃“事务日志”和备分的原数据库记录。完成之些工作后,事务被删除。

    事务处理的方法

     A。直接写SQL在存储过程中使用begin tran,commit tran,rollback tran实现
      优点:所有事务逻辑包含在一个单独的调用中;拥有运行一个事务的最佳性能;独立于应用程序
      限制:事务上下文仅存在于数据库调用中(即事务的SQL对外不能访问,只能调用存储过程);数据库代码与数据库系统有关(不同数据库写法不一样)。
     B。通过ADO.NET实现:调用Connection对象的Transaction方法。
       SqlTransaction Trans = Conn.BeginTransaction(); //SqlConnection
       Cmd.Transaction = Trans;  //SlqCommand
       try { ... Trans.Commit(); ...}
       catch(Exception Exp) {... Trans.Rollback(); ...}
       finally { Conn.Close(); }  
      优点:简单;和数据库事务速度相近;独立于数据库,不同数据库的专有代码被隐藏。
      缺点:事务不能跨越多个数据库连接;事务执行在数据库连接层上,所以需要在事务过程中维护一个数据库连接。
     C。COM+事务(可以利用COM+来完成在分布式应用程序中的事务控制
       在分布式应用程序中,我们经常需要同时操作多个数据库,使用数据库本身的事务处理很难满足程序对事务控制的要求(一般事务的操作必须在同一个数据库内)。
       为使该组件正确运行,该组件必须有一个强名称。生成一个强名称,然后使用该强名称对程序集进行签名。步骤如下(不懂,原文照搬):
       1。将TransactionAttribute类应用于您的类,指定组件请求的自动事务类型。事务类型必须是TransactionOption枚举的成员。
       2。从Servicedcomponent类派生您的类。ServicedComponent是所有使用COM+服务的类的基类。
       3。用强名称(strong name)标记(sign)程序集(assembly),确保程序集包含唯一的密钥对。
       4。在COM+ catalog中注册包含您的类的程序集。
      
    COM+事务实例
    A。右键解决方案,添加类库,名称为COM,新建EnterpriseCls类如下。

    Code

    B。项目中添加类库的COM.dll。使用EnterpriseCls类实例化对象时报错:在程序集中找到无效的ServicedComponent派生类。
    C。打开COM类库的Properties下的AssemblyInfo.cs,把[assembly: ComVisible(false)]中的false改成true。
    D。运行项目,再次报错:程序集XXX没有强名称。
    注:以下做法为本人归结,与邵老师的视频不符,如有错误,希望高人指出。
    E。把类库的COM.dll复制到C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0下。打开SDK命令提示(所有程序-Microsoft .NET Framework SDK v2.0。默认路径:C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0),输入以下命令:
     1。sn -k com.snk  //创建一个密钥
     2。ildasm com.dll /out=com.il  //反编译目标程序集
     3。ilasm com.il /dll /resource=com.res /key=com.snk //重新编译,附带强命名参数
     4。sn -v com.dll //验证签名信息
    F。把项目中原来的com.dll引用去掉,把生成的com.dll(sdk文件夹中)重新引入到项目中。编译,运行,通过。

    异常处理:可以使用checked或try...catch...finally语句。

    异常优化
    :确保所有程序的入口都使用了try-catch,在catch中截获所有的异常。

    异常注意事项

    A。当引发异常时,要提供有意义的文本。
    B。要引发异常仅当条件是真正异常;也就是当一个正常的返回值不满足时。
    C。如果你的方法或属性被传递一个坏参数,要引发一个ArgumentException异常。
    D。当调用操作不适合对象的当前状态时,要引发一个InvalidOperationException异常。
    E。要引发最适合的异常
    F。不要为正常或要预期的错误使用异常。
    G。不要为流程的正常控制使用异常。
    H。不要在方法中引发NullReferenceException或IndexOutOfRangeException异常。

    异常处理技术

    A。记录异常
     1。在文件中记录异常
     2。在数据库中记录异常
     3。在eventlog中记录异常
    B。发送email通知异常
    C。异常产生时,用友好的方式通知用户

    处理错误

    A。Page_Error事件
    B。Application_Error事件
    C。自定义错误页面<customError节点>3

  • 相关阅读:
    Vue——data中的属性规范
    python的字符串用法
    python笔录第一周
    Mac下python版本的更新
    我的第一篇博客
    C语言-控制语句(循环)
    C语言-控制语句(分支与跳转)
    C语言-函数
    C语言-数组与指针
    C语言-堆和栈
  • 原文地址:https://www.cnblogs.com/vipcjob/p/1555051.html
Copyright © 2011-2022 走看看