信息产业培训网

C#高级编程:事务处理和命令

http://www.miiceic.org.cn   2007-12-12 10:41:11   中程在线   浏览数:
关键字:.net
事务处理

    通常,对数据库要进行多次更新,这些更新必须在事务处理的范围内进行。ADO.NET中的事务处理首先要在数据库连接对象上调用BeginTransaction()方法,这些方法返回实现IDbTransaction接口的对象,而该对象是在System.Data中定义的。

    下面的代码序列是在Sql Server连接上开始事务处理的:
    string source = "server=(local)\\NetSDK;" +" integrated security=SSPI;" +"database=Northwind";
    SqlConnection conn = new SqlConnection(source);
    conn.Open();
    SqlTransaction tx = conn.BeginTransaction();
    // Execute some commands, then commit the transaction
    tx.Commit();
    conn.Close();

    在开始一个事务处理时,可以选择在该事务处理中执行的命令独立级别。该级别确定了如何在一个数据库会话中查看在另一个数据库会话中所进行的修改,并不是所有的数据库引擎都支持表21-1所示的4个级别。

 独 立 级 别  说    明
 ReadCommitted  SQL Server默认级别。这个级别可以确保只有第一个事务处理结束后,在第二个事务处理中才能访问第一个事务处理写入的数据
 ReadUncommitted
  即使一个事务处理还没有处理完数据,也允许另一个事务处理从数据库中读取数据。例如,如果两个用户在访问同一个数据库,第一个用户插入一些数据,但没有完成事务处理(通过Commit或Rollback方法),第二个用户把它们的独立级别设置为ReadUncommitted,因此可以访问数据
 RepeatableRead
 这个级别扩展了ReadCommitted级别,如果在事务处理中使用了相同的语句,无论是否有其他潜在的数据库更新,总是可以返回相同的数据。这个级别要求对数据进行额外的锁定,这会降低性能。 这个级别可以保证,对于初始查询的每一行,都不会修改数据,但允许显示“假想(phantom)”行—— 这些行是在进行事务处理时,由另一个事务处理插入的全新数据行
 Serializable
 这是最“高级”的事务处理级别,对数据库中的数据进行序列化的访问。利用这种独立级别,不会显示假想行,所以在序列化的事务处理中使用的SQL语句总是检索相同的数据。序列化事务处理对性能的负面影响不应低估,如果肯定不需要这个独立级别,最好不要加上它

表  21-1

    SQL Server的默认独立级别ReadCommitted是数据一致性和数据可用性的一种很好的折衷,因为它比RepeatableRead 或 Serializable模式中需要的数据锁定都少。但是,有时应提高独立级别,这样在.NET中,才能用一种非默认的级别开始事务处理。使用哪个级别没有硬性规则,全凭经验。

    注意:如果当前使用的是不支持事务处理的数据库,应转而使用支持它的数据库。一旦我们成为可以完全信任的雇员,且拥有错误数据库的全部访问权限,就可能试键入id=99999以删除对应的错误,但实际上输入的是<而不是=,此时会删除整个错误数据库,这可不是我们希望的。幸好I.S.小组每天晚上都会备份该数据库,可以恢复它,但使用回滚命令会更简单。

    命令

    在21.2节中简要介绍了针对数据库执行的命令。简言之,命令就是一个要在数据库上执行的SQL文本字符串。命令也可以是一个存储过程,或者返回表中所有列和所有行的表名(例如SELECT *样式的子句)。

    把SQL子句作为一个参数传递给Command的构造函数,就可以构造一个命令,如下   所示:
    string source = "server=(local)\\NetSDK;" +" integrated security=SSPI;" +database=Northwind";
    string select = "SELECT ContactName,CompanyName FROM Customers";
    SqlConnection conn = new SqlConnection(source);
    conn.Open();
    SqlCommand cmd = new SqlCommand(select, conn);

    <provider>Command类的属性CommandType可以定义某个命令是一个SQL子句、一个存储过程的调用、或者是一个完整的表语句(仅从给定的表中选择所有的列和行)。表21-2总结了CommandType枚举。    

命 令 类 型 样    例
Text(默认) String select = "SELECT ContactName FROM Customers";
SqlCommand cmd = new SqlCommand(select,conn);
StoredProcedure
SqlCommandcmd=new SqlCommand("CustOrderHist",conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@CustomerID","QUICK");
TableDirect OleDbCommand cmd = new OleDbCommand("Categories",conn);
cmd.CommandType = CommandType.TableDirect;

表  21-2

    在执行一个存储过程时,需要把参数传送给过程。上面的示例直接设置了参数@CustomerID,但设置参数的值还可以使用其他方式,详见本章的后面。

    提示:TableDirect命令类型只对OleDb提供程序有效—— 如果试图把这个命令类型用于其他提供程序,就会产生异常。

来源:csai
相关连接
最新评论
*以下网友发言不代表中程在线网站的观点和看法
    我要评论

    请您注意
    1、遵守中华人民共和国的各项有关法律规定
    2、承担一切因您的行为而导致的法律责任
    3、本网留言管理人员有权删除其管辖留言内容
    4、您在本网的留言本网有权在网站内转载和引用
    5、参与本留言即表明您已经阅读并接受上述条款
    我爱研发网希赛网软件测试网中电华信太平洋电脑网天空网
    电脑爱好者泡泡网华军软件霏凡软件站软件开发网腾讯网
    eNet下载汉化新世纪小熊在线BIOS之家数动连线....[更多]
    关于我们 | 网站地图 | 周边住宿 | 行车路线 | 联系我们 | 网站律师 | 意见反馈 | 虚位以待 | 友情链接
    中程在线(北京)科技有限公司 版权所有
    总 部:北京市海淀区青东商务楼A座西四层
    企业培训部:010-52636110 52636106 就业培训部:010-68716925 68716926
    邮 件:training@miiceic.org.cn
    京ICP备06053134号
    Copyright © 2005-2008 Miiceic.org.cn All Rights Reserved