事务
BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。
事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。
BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。
事务处理在应用系统开发中起着重要的作用。简单地来说,事务就是由若干步处理组成的工作单元,这些步骤之间具有一定的逻辑关系,作为一个整体的操作过程,每个步骤必须同时成功或者失败。当所有的步骤都成功的时候,事务就必须“提交”,而当其中有一个步骤失败的时候,整个事务都必须“回滚”,也就是,其中的每一个步骤所做的改动都必须撤销。
事务的主要特性包括原子性、一致性、隔离性和永久性,即所谓的ACID属性。
1 原子性
表示事务作为一个工作单元处理。事务可能包括若干个步骤,通过把这些步骤作为一个工作单元处理,并在进程周围放上逻辑边界,就可以要求每一个步骤都完全成功,否则,就不能进行下一步的操作。每一个步骤都依赖于前一步的顺利完成。如果一步失败,则不能完成任何其余的步骤,前面已经完成的步骤也必须全部回滚。
2一致性
将保证事务使系统或数据处于一致状态。数据处于一致状态就是符合数据库的限制或规则。限制就是事务完成时要成立的数据库条件,已在定义数据库结构时被定义,用以指定主键、数字字段有效范围和可否包含null值之类的事项。如果事务开始时系统处于一致状态,则事务结束时系统也应处于一致状态,不管事务成功还是失败,提交还是撤销。
3 隔离性
提供了事务处理中最强大的特性之一。简单地说,隔离性能保证事务访问的任何数据不会受其他事务所做的任何改变的影响,直到第一个事务完成。这等于让事务象系统中的唯一事务一样执行。其他请求的数据库操作只能在不破坏当前使用的数据时才能进行。这对于支持数据的并发访问至关重要。
4永久性
指定了事务提交时,对数据所做的任何改变都要记录到永久存储器中。这通常通过事务日志来实现。事务日志将数据存放在数据库之类的资源中,可以在遇到故障时 重新采用丢失的事务,也可以在遇到错误时撤销事务。简单的说,事务日志负责跟踪数据库中发生的每个数据操作,使数据可以返回到搞乱前的已知状态。一旦系统恢复到已知状态后,便可以利用事务日至更新构造或重新采用从这个状态开始的改变。
事务的管理可以用SQL语句在支持事务管理的数据库管理系统中实现,也可以在ADO.NET中实现.
在SQL语句中, 主要有3条语句用于管理事务.
1. BEGIN TRAN: 表示事务的开始
2. COMMIT TRAN: 表示事务的提交. 从Begin Tran 到Commit Tran中的语句即为事务的部分.
3. ROLLBACK TRAN: 事务的回滚(撤销). 将事务回滚到开始或指定的地方.
例: 图示馆管理系统的数据库中存在: tblDZ读者表, tblSM书目表, tblJYQK借阅情况记录表.
tblDZ:
列名 | 类型 | 说明 |
BH | char(10) | 读者编号,主键 |
XM | varchar(10) | 读者姓名 |
BM | varchar(20) | 读者所在部门 |
tblSM:
列名 | 类型 | 说明 |
SH | char(10) | 书号,主键 |
SM | varchar(20) | 书名 |
JG | money | 价格 |
ZD | char(6) | 状态 |
tblJYQK:
列名 | 类型 | 说明 |
BH | char(10) | 读者编号,主键 |
SH | char(10) | 书目编号,主键 |
JYRQ | datetime | 借阅日期 |
实现借阅功能的存储过程:
create procedure JY
(
@BH char(10), --读者的编号
@SH char(10) --书的编号
)
AS
Declare @err1 int, @err2 int --定义两个变量用于存放产生的错误值
BEGIN TRAN --事务由此处开始
update tblSM set ZD='不存在' where SH=@SH --改变书的状态
set @err1=@@error
insert into tblJYQK values(@BH,@SH,getdate()) --添加借阅记录
set @err2=@@error
IF @err1=0 and @err2=0 --判断是否发生了错误
COMMIT TRAN --没有错误就提交事务
ELSE
ROLLBACK TRAN --发生错误,回滚
在ADO.NET中, 事务的管理可以通过Transaction对象来处理.
public void TranTest()
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data Source=**;Initial Catalog=Test;User ID=**;Password=**";
conn.Open();
SqlTransaction trans = conn.BeginTransaction(); //定义一个事务对象
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
try
{
//修改书目的状态
cmd.CommandText = "update tblSM set ZD='不存在' where SH='111111'";
cmd.ExecuteNonQuery();
//向借阅信息表中插入借阅信息
cmd.CommandText = "insert into tblJYQK values('123','111111',getdate())";
cmd.ExecuteNonQuery();
trans.Commit(); //正常情况下提交事务
}
catch
{
trans.Rollback(); //发生异常,则回滚事务
}
finally
{
conn.Close();
}
}