事务是一组作为一个单元成功或失败的相关任务。在事务处理术语中,事务要么提交,要么中止。若要提交事务,所有参与者都必须保证对数据的任何更改是永久的。不论系统崩溃或是发生其他无法预料的事件,更改都必须是持久的。只要有一个参与者无法做出此保证,整个事务就会失败。事务范围内的所有数据更改将回滚到特定设置点。事务将多个任务绑定在一起。例如,假设某个 ASP.NET 页执行两个任务。它首先在数据库中创建一个新表。接着调用专用对象收集和格式化数据,并在新表中插入数据。这两个任务是相关甚至相互依赖的,因此除非可用数据填充表,否则应避免创建新表。在一个事务范围内执行两个任务会加强两者之间的关系。如果第二个任务失败,则第一个任务回滚到创建新表前的点。如此例所示,可将事务限制到一个数据资源,如数据库或消息队列。这些数据资源通常提供本地事务功能。这些事务由数据资源控制,管理起来轻松高效。事务还可以跨越多个数据资源。分布式事务使您得以将出现在不同系统上的若干不同操作合并为单个的成功或失败操作。---------------------------------------
以上是关于事物的原理介绍----------------------------------------
下面是vb的例子
----------------------------------------此示例创建包括两个 Update 调用的 SqlTransaction。相同的概念适用于其他 .NET Framework 数据提供程序。示例
Dim myTransaction As SqlClient.SqlTransaction
dcNorthwind.Open()
myTransaction = dcNorthwind.BeginTransaction()
daCustomers.UpdateCommand.Transaction = myTransaction
daOrders.UpdateCommand.Transaction = myTransactionTry
    daCustomers.Update(DsNorthwind1)
    daOrders.Update(DsNorthwind1)
    myTransaction.Commit()
Catch dbcex As DBConcurrencyException
    MessageBox.Show("Update Failed, Concurrency Exception")
    myTransaction.Rollback()
Catch ex As Exception
    MessageBox.Show("Update Failed")
    myTransaction.Rollback()
Finally
    dcNorthwind.Close()
End Try
编译代码
本示例需要: 对 System 和 System.Data 命名空间的引用。 
与 Northwind 示例数据库之间的数据连接 dcNorthwind。 
两个名为 daCustomers 和 daOrders 的数据适配器。 
名为 DsNorthwind1 的类型化数据集。 
注意   有关不使用 SQL Server .NET 数据提供程序的事务的更多信息,请参见 OleDbTransaction 类、OdbcTransaction 类或 OracleTransaction 类
可靠编程
以下情况可能会导致异常: 在获取操作和更新操作之间修改了数据库中的记录 (DBConcurrencyException)。 
数据库不可用(OleDbException 类、SqlException 类、OdbcException 类或 OracleException 类,异常因数据库而异) 
将 transaction.Rollback 调用包装到它自己的 Try...Catch 块中,以免回滚失败。安全性
该应用程序要求访问数据库的权限。

解决方案 »

  1.   

    另外,你所说的生成编码子类用流水号的情况,最好用事务和主键配合使用的办法
    比如,表中的id字段,设为主键,则用事务加以保护的时候,会触发主键不唯一的sql错误,导致事务回滚,这是为了以防万一。
    因为,事务保护,说白了,就是表一级的锁定,而锁定仅在update,insert语句的作用期有效,不影响select语句,也就是说,如果某人正在更改id,而其他人同时作相同操作,仍有可能二者产生的新id相同,此时,如果没有主键作为第二保护,也有无效数据的产生。
      

  2.   

    把MaxId的生成和插入数据加入到一个事务,假如插入数据不成功,调用transaction.Rollback,回滚事务,可以再次调用这个子程序,执行插入数据,这个MaxId的生成应该不会造成垃圾数据,应该不用回滚事务把?谢谢風之影:我对如何解决我得问题还是有点模糊,如何保证在生成MaxId何成功插入数据之间,不再生成另外一个MaxId,就算把生成MaxId,插入数据加入一个事务,也无法保证这个期间不会有令外一个相同的事务发生吧?也就不能保证在这个事务发生的期间,不再生成MaxId!还是我得理解有错误?这个事务如何设计呢?
      

  3.   


    我的数据库设计有问题,这样的话,我要把TopId何DownId合为一个数据字段设为主键,这样就可以了.再问一个问题:假如事务失败,可以用户的这次添加可以在用户不参与的情况下再次插入,直到成功为止吗(哈:没完了还)?谢谢啊