`

利用事务维持数据库的一致性

阅读更多

本文英文原版:
http://aspnet.4guysfromrolla.com/articles/072705-1.aspx

利用事务维持数据库的一致性

导言:

虽然数据库可以存储大量的数据供我们查询,但如果这些数据是错误的、无意义的那么这些数据和查询功能都变的毫无意义.不过数据库有很多的技术来确保数据的完整性和一致性:primary key约束和unique约束用于确保实体完整性;foreign key约束确保关系完整性,而事务transactions则确保数据库的数据维持一致性.

虽然INSERT, UPDATE,和DELETE statement是对数据库最常见的操作,但在有些时候我们想将多个INSERT, UPDATE, 和/或DELETE statements当作一个原子操作(atomic operation)来对待.也就是说,在某些情况下,我们不想把每个INSERT, UPDATE,和DELETE statement单独对待,而是将一系列的这些statement作为不可分割的整体的进行处理.当发出这些statement时,我们希望它们要么都执行成功,要么都执行失败——不应该有一些成功一些失败的情况发生.

比较典型的事务案例是将money从一个帐户转到另一个帐户上.银行处理money帐户转移要处理2个步骤;如果我们从经常帐户上转$500到储蓄存款帐户上,我们应处理下面的2个步骤:

.首先,必须从经常帐户上扣除$500;
.然后,将这$500增加到储蓄存款帐户上;


Transaction示例

在考察建立一个事务所必需的.NET代码之前,我们先讨论需要用到事务的比较常见的场合.前面我们提到了使用事务的典型场景——现金转帐.如果你要对一个或多个table执行多个修改命令——INSERT, UPDATE,或DELETE——且这些行为需要作为一个整体作为原子单元的时候,那么你就要使用到事务了.

比较常见的例子是在一个数据库里有2个或更多的有父/子关系的表的情况.当从父表删除一条记录时,你需要删除相关的子记录(或为这些子记录重新分配父关系).因此,当你要删除一个父记录时,你应该包含2个SQL statements,比如:

-- DELETE child records
DELETE FROM ChildTable
WHERE ParentID = IDofParentBeingDeleted

-- DELETE parent record
DELETE FROM ParentTable
WHERE ParentID = IDofParentBeingDeleted

另一个比较常见的例子是,你有2个逻辑相关的表,当添加或更新一个表时,也需要同时添加或更新另一个表.比如,假设有一个在线汽车保险网站,你除了要提交于保险相关的信息——日期、年龄、婚姻关系等之外,你可能还要提供你知晓该网站的途径——广播、电视、朋友等等.当点击提交后,网站会做2个添加记录动作——一个是与保险相关的,另一个是登陆者找到该网站的途径信息.


事务不仅可以保护免受流程步骤中断而带来的意想不到的灾难事故影响,也可以保护免受意想不到的与SQL相关的错误.比如,假想你有5个UPDATE指令,你想把它作为一个逻辑上一组的、单一的原子操作.但是不管是什么原因,第5个UPDATE指令包含了一个非法的值,并导致错误.如果没有事务的话,第5条指令不会更新数据库,但前面4条记录会,这样一来,在逻辑上数据库就陷入一种逻辑不一致的状态.


事务的通常步骤

使用事务时,一般来说你要用到下面的步骤:

1.明确指出你想开启一个事务.所有的指令从此时起在逻辑上都是原子操作的一部分
2.发出指令——那些包含在事务里的INSERT, UPDATE,和DELETEs
3.如果出错,回滚事务.回滚的作用在于前面执行的指令都无效.
4.如果全部正常,则提交事务.通过事务对数据库更新.

因为事务是"原子的",所有如果有任何的突然事故——比如断电、数据库服务器发生碰撞等——事务就会回滚,确保系统的一致性.

当通过.NET来处理事务时,你将开启事务,再通过事务对象来发出一系列的指令.当执行SQL statements出错时用Try ... Catch来捕获异常,此时你可以回滚事务。如果没有出错则提交事务.

用SqlTransaction Class类处理事务

如果你用的是Microsoft SQL Server,那么你就可以使用System.Data.SqlClient.SqlTransaction class类来开启一个事务.首先通过SqlConnection class类来打开一个到数据库的连接,然后调用SqlConnection class类的BeginTransaction()方法来创建一个事务实例,如下:

'Create a connection
Dim myConnection As New SqlConnection(myConnString)
myConnection.Open()

'Start the transaction
Dim myTrans As SqlTransaction = myConnection.BeginTransaction

接下来,你要创建一个用来发出指令的SQL statements的SqlCommand对象.当创建该对象后,你需要指定它使用ID为myTrans的SqlTransaction对象.你可以通过通过构造器来指派,或者通过SqlCommand的Transaction属性来指派.

... Continued from above ...

Try
'Specify the first statement to run...
Dim sql as String = "INSERT INTO ..."

'Create the SqlCommand object, specifying the transaction through
'the constructor (along with the SQL string and SqlConnection)
'Alternatively, could set properties of myCommand
'to specify the Connection, CommandText, and Transaction...
Dim myCommand as New SqlCommand(sql, myConnection, myTrans)

注意,我们已经有了SqlCommand对象,并且在Try ... Catch模块里发出对数据库的指令,此时,你就可以继续发出对数据库的指令了:

... Continued from above ...

myCommand.ExecuteNonQuery()

'Issue another INSERT
myCommand.CommandText = "INSERT INTO ..."
myCommand.ExecuteNonQuery()

... Lather, rinse, repeat as needed! ...

'If we reach here, all command succeeded, so commit the transaction
myTrans.Commit

Catch ex as Exception
'Something went wrong, so rollback the transaction
myTrans.Rollback()

Throw 'Bubble up the exception
Finally
myConnection.Close()'Finally, close the connection
End Try

要做的就这些了!你可以向数据库发出剩下的那些相关的SQL statements.注意,如果发生任何的错误将回滚事务,如果一切无误的话则提交事务.不过管是否引发异常都将执行Finally模块里的代码,关闭数据库连接.

Maintaining Transactions in T-SQL
你也可以直接用T-SQL语法来管理事务.而不用在你的代码里使用SqlTransaction class类,你可以将transaction syntax转移到一个存储过程里(也就是用多个statement来改动数据).具体信息请参考文章《Managing Transactions in SQL Server Stored Procedures》

结语:

在本文我们考察了数据库事务的概念,以及如何在.NET里将SQL statement封装到一个事务里.在创建ASP.NET数据驱动应用程序时维护你的数据的一致性是很重要的.当多个INSERT, UPDATE,或DELETE statements构成一个逻辑上的原子操作时,我们很有必要将这些statement封装到一个事务里.

祝编程快乐!

分享到:
评论

相关推荐

    在多层结构中利用事务处理保证数据的一致性

    ### 在多层结构中利用事务处理保证数据的一致性 #### 摘要与背景介绍 随着企业信息化的发展,确保数据一致性成为了维护业务流程稳定性和可靠性的关键因素之一。数据库管理系统(DBMS)通过事务处理机制来保障数据...

    分布式数据库中维持数据副本一致性的方法——SQL Server 7.0数据复制的原理及应用.pdf

    "分布式数据库中维持数据副本一致性的方法——SQL Server 7.0数据复制的原理及应用" 维持数据副本一致性是分布式数据库系统面临的重要挑战之一。随着计算机系统体制结构的分布化和地域的分布,数据库系统的分布化也...

    MySQL大神模拟当主库意外宕机 保证主从事务的一致性实战手册.pdf

    总的来说,这份手册详细阐述了如何在主库宕机的情况下,利用binlog server来维持主从事务的一致性,从而确保数据库系统的稳定性和可靠性。这种方法对于防止数据丢失和业务中断具有重要意义,特别是在高并发、高可用...

    分布式工程数据库系统中事务管理机制相关技术的研究

    事务管理子系统负责调度、管理在分布式数据库上运行的事务,确保它们的初始化、执行与终止,同时维持事务属性、数据库一致性与完整性,解决系统可靠性、事务并发控制及资源优化等问题。 #### 事务管理机制的挑战 ...

    数据库恢复技术(PPT文档,内容较全面,易懂)

    一致性确保事务结束后数据库保持合法状态;隔离性保证并发执行的事务之间互不影响;持续性则保证一旦事务提交,其结果将永久保存,即使发生故障。 数据库恢复主要应对三种类型的故障:事务内部故障、系统故障和介质...

    数据库恢复技术库恢复技术.ppt

    动态转储则允许在转储过程中运行事务,提高了数据库的可用性,但可能需要利用事务日志来确保一致性。转储还可以进一步分为海量转储(转储全部数据)和增量转储(仅转储自上次转储以来更改的数据),每种都有其适用...

    完整版微服务架构的分布式事务解决方案

    - Saga是一种长事务模型,由一系列局部事务组成,通过补偿事务来撤销前面的操作以维持全局一致性。 5. **分布式事务中间件** - 例如TCC(Try-Confirm-Cancel)、SAGA模式、Seata等。 6. **消息队列** - 利用...

    MySQL数据库的同步

    此外,Java还可以利用开源框架如Spring Data JPA、MyBatis等简化数据库操作,并提供高级功能,如事务管理、缓存策略等,以提高同步效率和数据一致性。 为了实现数据库同步,需要考虑以下关键点: 1. **故障检测**...

    PHP与MySQL平台下的事务实现探讨.pdf

    【PHP与MySQL平台下的事务实现】探讨的文章主要讨论了如何在PHP编程环境下,利用MySQL数据库进行事务处理,确保数据的一致性和完整性。事务是数据库管理中的核心概念,它确保了一系列数据库操作要么全部成功,要么...

    TUXEDO与ORACLE数据库的互连

    4. **实现事务管理**:在TUXEDO应用程序中,利用提供的事务管理API来控制事务边界,确保事务能够跨越不同的数据库操作,维持数据的完整性和一致性。 5. **测试连接**:完成配置后,通过TUXEDO的测试工具或编写简单...

    数据库系统基础教程(第三版)英文版 第一章

    2. **一致性**(Consistency):事务将数据库从一个一致状态转换到另一个一致状态。 3. **隔离性**(Isolation):事务之间相互独立,互不影响。 4. **持久性**(Durability):一旦事务提交,其效果将永久保存在...

    性能测试中常见的数据库指标

    15. **日志写入速度(Log Write Speed)**:数据库写入事务日志的速度,对ACID(原子性、一致性、隔离性、持久性)属性的维持至关重要。 通过这些指标,我们可以分析数据库性能瓶颈,定位问题并进行优化。例如,...

    TCP通信存入数据库

    2. 数据一致性:在并发环境下,确保数据库操作的一致性和原子性至关重要,可能需要用到事务处理。 3. 安全性:数据传输应加密,以防止中间人攻击,同时数据库访问应限制权限,避免未授权访问。 4. 性能优化:合理...

    Quest-SharePlex数据库复制解决方案

    - **数据一致性保障**:严格的事务一致性保证,确保复制过程中的数据准确无误。 - **图形化管理界面**:提供直观易用的图形化用户界面,简化了管理和监控流程。 - **双向复制功能**:支持数据的双向同步,方便进行...

    HBase分布式事务与SQL实现

    Percolator的事务特性包括ACID(原子性、一致性、隔离性、持久性)语义和快照隔离(Snapshot Isolation),后者对于关系型数据库管理系统(RDBMS)而言可能偏弱,因此需要显式地维持锁。Percolator包括三个主要组件...

    多年的数据库设计经验总结

    - 实施事务处理机制,确保数据操作要么全部成功要么全部失败,从而保持数据的一致性。 - 定期备份数据库,以防数据丢失或损坏时能够恢复数据。 #### 五、各种小技巧 - 利用触发器来自动执行特定任务,如更新日志...

    多模态数据库的异构数据更新.pptx

    - **一致性:** 为了确保多模态数据库中异构数据的完整性和一致性,通常会采用一系列一致性约束,包括数据值、数据结构和语义规则等,并通过事务处理、数据验证和业务规则引擎等机制来实施。 - **安全:** 数据安全...

    数据库系统原理与实践习题答案第12章.docx

    - **支持事务恢复**:日志文件中的信息可用于事务故障恢复,确保未完成的事务被撤销,已完成的事务被重做,从而维持数据库的一致性。 - **辅助介质故障恢复**:在发生介质故障的情况下,如果仅有数据库备份而没有...

    数据库技术及应用:chapter3 关系数据库标准语言SQL.pdf

    完整性约束条件确保数据的准确性与一致性,可分为实体完整性约束、参照完整性约束以及用户自定义的完整性。实体完整性约束指定了一个表的主键(Primary Key),确保了表中记录的唯一性。参照完整性约束用来维持...

Global site tag (gtag.js) - Google Analytics