重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
数据库事务简介 数据库事务是由一组 SQL 语句组成的一个逻辑工作单元 您可以把事务看作是一组不可分的 SQL 语句 这些语句作为一个整体永久记录在数据库中或一并撤销 比如在银行帐户之间转移资金 一条 UPDATE语句将从一个帐户的资金总数中减去一部分 另一条 UPDATE语句将把资金加到另一个帐户中 减操作和加操作必须永久记录在数据库中 或者必须一并撤销 — 否则将损失资金 这个简单的示例仅使用了两条 UPDATE 语句 但一个更实际的事务可能包含许多 INSERT UPDATE和 DELETE 语句 要永久记录一个事务中的 SQL 语句的结果 您可以通过 MIT 语句来执行提交 要撤销 SQL 语句的结果 您可以使用 ROLLBACK 语句来执行回滚 这会把所有的行重设为它们原来的状态 只要您事先没有与数据库断开 则您在执行回滚之前所做的任何修改都将被撤销 您还可以设置一个保存点 以便将事务回滚至该特定的点 同时保持事务中的其他语句原封不动 使用数据库事务(主要针对)您可以使用 OracleTransaction 类的一个对象来表示一个事务 OracleTransaction 类包含多个属性 其中的两个为 Connection(指定与事务关联的数据库连接)和 IsolationLevel(指定事务隔离级别)Connection 指定与该事务关联的OracleConnection对象 IsolationLevel 指定该事务的IsolationLevel 枚举类型 用于对事物的锁定 取值有Chaos ReadCommited ReadUnmited RepeatableRead Serializable Unspecified 应用程序通过针对OracleConnection对象调用 BeginTransaction 来创建OracleTransaction对象 对OracleTransaction对象执行与该事务关联的所有后续操作(例如提交或中止该事务) Commit:提交SQL数据库事务 Rollback :从挂起状态回滚事务 您还可以使用 Save() 在事务中设置一个保存点 下面的示例创建一个 OracleConnection 和一个 OracleTransaction 它还演示了如何使用 BeginTransaction Commit 和 Rollback 方法 (这是MSDN里的范例)需要注意的是 这些操作需要引入命名空间: Oracle DataAcess ClientOracle DataAccess Client 命名空间是 ODP NET 的一部分 它包含许多类 其中有 OracleConnection OracleCommand 和 OracleTransaction 示例程序就用到了这些类 事务操作 Public Sub RunOracleTransaction()Sub RunOracleTransaction(myConnString As String) Dim myConnection As New OracleConnection(myConnString) myConnection Open() Dim myCommand As OracleCommand = myConnection CreateCommand() Dim myTrans As OracleTransaction Start a local transaction myTrans = myConnection BeginTransaction(IsolationLevel ReadCommitted) Assign transaction object for a pending local transaction myCommand Transaction = myTrans Try myCommand CommandText = INSERT INTO Dept (DeptNo Dname Loc) values ( TECHNOLOGY DENVER ) myCommand ExecuteNonQuery() myCommand CommandText = INSERT INTO Dept (DeptNo Dname Loc) values ( ENGINEERING KANSAS CITY ) myCommand ExecuteNonQuery() myTrans Commit() Console WriteLine( Both records are written to database ) Catch e As Exception myTrans Rollback() Console WriteLine(e ToString()) Console WriteLine( Neither record was written to database ) Finally myConnection Close() End Try End Sub
创新互联是一家业务范围包括IDC托管业务,虚拟空间、主机租用、主机托管,四川、重庆、广东电信服务器租用,成都二枢服务器租用托管,成都网通服务器托管,成都服务器租用,业务范围遍及中国大陆、港澳台以及欧美等多个国家及地区的互联网数据服务公司。
在 NET 程序中设置事务保存点 正如本文前面所提到的那样 您可以设置一个保存点 以便将事务回滚至该特定的点 同时保持事务中的其他语句原封不动 您可以使用 OracleTransaction 类的 Save() 方法在事务中设置保存点 如果您有一个非常长的事务并且希望能够仅回滚到某个特定的时间点 那么您可能要使用保存点 例如 您可能想对 个产品做一些更改 然后设置一个保存点 然后再对另 个产品做更改 如果您在进行第二批更改时出现了错误 那么您可以回滚至保存点 使您的第一批更改原封不动 使用OracleTransaction对象需要注意的几点 )你需要在你整个事务执行中只能有唯一OracleConnection OracleCommand
OracleTransaction 也就是说如果你事务处理过程中如果需要与数据库的操作都只能在这唯一的Command中执行 类似于:
imgCommand CommandText = sSQLimgCommand ExecuteNonQuery()或其他操作若你新建一个连接执行其他数据库操作的话 整个事务过程就会抛出异常 )如果你需要在你SQL语句中加入参数 则你必须在你执行完提交或相关数据库操作之后将其Command的参数清空 下边举一个实际的项目里的事务函数 事务函数 summary 保存热点文本文件信息到数据库 /summary Private Function SaveTextFile()Function SaveTextFile() As Boolean Dim sSQl As String sSQl = select type_id from sys_file_type where file_extname= TXT Try imgCommand CommandText = sSQl Dim typeID As Int = Convert ToInt (imgCommand ExecuteScalar()) 文件类型 读取文本信息 Dim Textblob() As Byte = GetText() sSQl = insert into t_watch_textcontent(image_id text_content type_id) values(:imageid :textcontent :typeid) 增添SQL参数 Dim Param As OracleClient OracleParameter Param = New OracleClient OracleParameter( imageid sNewImageID) imgCommand Parameters Add(Param) Param = New OracleClient OracleParameter( textcontent Textblob) imgCommand Parameters Add(Param) Param = New OracleClient OracleParameter( typeid typeID) imgCommand Parameters Add(Param) 提交信息 imgCommand CommandText = sSQl If imgCommand ExecuteNonQuery() Then bResult = True 关键是这里 需要你手动清除参数 imgCommand Parameters Clear() End If Catch ex As Exception Me ExceptionMessage = ex bResult = False End Try Return bResult End Function lishixinzhi/Article/program/net/201311/12778
这两天看了 g 的CONCEPT文档的事务部分 发现 自治事务 还有一些以前没有注意到的地方 这里简单总结一下
这一篇简单描述一下自治事务可以使用的位置
自治事务可以使用在以下的位置
存储过程和函数;
本地过程和函数;
包;
对象方法;
匿名块的最顶层
其中过程 函数和包中使用自治事务很常见 大部分自治事务的情况都属于这种情况 由于对象相对使用的比较少 所以对象方法中的自治事务也是比较少见的 不过由于对象中的方法和包中的存储过程 函数十分相似 所以这种情况也是情理之中的
剩下的两种情况 是以前所不了解的 从来没有想过对于本地过程和函数也是可以定义为自治事务的 不过本地过程定义为自治事务是十分方便的功能 使得过程中需要用到自治事务的功能时 不必再额外定义一个自治事务的存储过程 只需要在当前的过程中定义一个自治的本地过程就可以了
一个简单的例子如下
SQL CREATE TABLE T_AUTO_TRANS (ID NUMBER NAME VARCHAR ( ));
表已创建
SQL CREATE TABLE T_LOG (ID NUMBER NAME VARCHAR ( ));
表已创建
下面建立一个LOCAL PROCEDURE的自治事务的例子
SQL DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO T_LOG VALUES ( AUTONOMOUS_TRANSACTION ); MIT; END; /
PL/SQL 过程已成功完成
SQL SELECT * FROM T_AUTO_TRANS; ID NAME TEST SQL SELECT * FROM T_LOG; ID NAME AUTONOMOUS_TRANSACTION AUTONOMOUS_TRANSACTION SQL ROLLBACK;
回退已完成
SQL SELECT * FROM T_AUTO_TRANS;未选定行
SQL SELECT * FROM T_LOG; ID NAME AUTONOMOUS_TRANSACTION AUTONOMOUS_TRANSACTION
lishixinzhi/Article/program/Oracle/201311/18742
oracle的事务是以session开始登录后的第一条DML语句开始的,然后以DDL(drop,create,alter,rename等),TCL的rollback,commit,DCL(grant,revoke)结束。
当然你也可以手动设置事务属性,如只读事务或者顺序事务:
set transaction read only
set transaction isolation level SERIALIZABLE