Oraclee 事务处理以及在c#中使用oracle的事务处理【转载】
2015-03-17 17:07
399 查看
1、 savepoint(建立保存点,用于失误时回滚到保存点)
建立保存点a1:savepoint a1;
............................[其间干了很多事]
再建立保存点a2:savepoint a2;
............................[又再干了很多事]
回滚到a2保存点:rollback to a2;
回滚到a1保存点:rollback to a1;
如果不指定保存点即为取消全部事务,如:rollback;
注意:如果建立保存点后执行过:commit语句,则为提出交事务,确认事务变化、结束事务、删除所有保存点、释放锁。
当使用commit语句结束事务后,其它会话将可以查看到事务变化后的新数据。
2、只读事务:transaction read only
一旦设定了只读事务(一般数据库管理员设定) ,则其它人提交上来的动作都不会看到。
如管理员操作:set transaction read only;
A用户操作增删改:。。。。。。(自已进行查询时可以看到所影响的数据)
B用户查询时:。。。。。。。。(看不到A用户进行过操作所影响的数据)
修改事务为读写的命令为:SET TRANSACTION READ WRITE;
3、在C#代码中使用Oracle的数据库事务
OracleTransaction类的概述
应用程序通过针对OracleConnection对象调用 BeginTransaction 来创建OracleTransaction对象。对OracleTransaction对象执行与该事务关联的所有后续操作(例如提交或中止该事务)。
OracleTransaction的成员主要有:
属性: Connection,指定与该事务关联的OracleConnection对象;
IsolationLevel,指定该事务的IsolationLevel;
枚举类型,用于对事物的锁定,取值有Chaos、ReadCommited、ReadUncommited、RepeatableRead、Serializable、Unspecified。
方法: Commit,提交SQL数据库事务;
Rollback , 从挂起状态回滚事务;
第一个示例:
public void 函数名称()
{
string strUpdateSql1 = "update 表名 set XH='...' where XH='...' and LCGZ_ID='...';
string strUpdateSql2 = "update 表名 set XH='...' where BZGZ_ID='...';
OracleConnection conn = new OracleConnection();
conn.ConnectionString = "数据库连接字符串";
conn.Open();
OracleTransaction updateProcess = conn.BeginTransaction();
try {
OracleCommand comm1 = conn.CreateCommand();
comm1.CommandText = strUpdateSql1;
comm1.Transaction = updateProcess;
comm1.ExecuteNonQuery();
OracleCommand comm2 = conn.CreateCommand();
comm2.CommandText = strUpdateSql2;
comm2.Transaction = updateProcess;
comm2.ExecuteNonQuery();
updateProcess.Commit();
}
catch()
{
updateProcess.Rollback();
}
finally { conn.Close(); } }
第二个示例: public static bool 函数名2(int fID)
{
OracleConnection conn = new OracleConnection();
conn.ConnectionString = "数据库连接字符串";
conn.Open();
OracleTransaction deleteProcess = conn.BeginTransaction();
try {
ArrayList alObjects = GetObjects();
foreach(object o in alObjects)
{
OracleCommand tmpComm = conn.CreateCommand();
tmpComm.Transaction = deleteProcess;
tmpComm.CommandText = "delete from 表1名 where BZGZ_ID="+o.ID;
tmpComm.ExecuteNonQuery();
OracleCommand tmpComm2 = conn.CreateCommand();
tmpComm2.Transaction = deleteProcess;
tmpComm2.CommandText = "delete from 表2名 where BZGZ_ID="+o.ID;
tmpComm2.ExecuteNonQuery();
}
OracleCommand comm = conn.CreateCommand();
comm.Transaction = deleteProcess;
comm.CommandText = "delete from 表3名 where LCGZ_ID="+fID;
comm.ExecuteNonQuery();
deleteProcess.Commit();
return true;
}
catch()
{
deleteProcess.Rollback();
return false;
}
finally { conn.Close(); }
=========================================================================
Connection一旦开了一个事务,则执行的命令就必须和事务相关 要注意的是,在事务进行中,不能再对同一个数据库连接(OracleConnection)再进行事务外的数据的查询和读取,
也就是说,类似下边的语句是不能执行的: OracleDataAdapter mAdp = new OracleDataAdapter(sSql, mCon); DataTable mDst = new DataTable(); mAdp.Fill(mDst);
而是得加一条语句,在事务内进行查询: OracleDataAdapter mAdp = new OracleDataAdapter(sSql, mCon); if (trans != null) mAdp.SelectCommand.Transaction = trans; DataTable mDst = new DataTable(); mAdp.Fill(mDst);
总结:在事务块内,如果使用同样的Connection对象查询,但不指定事务,会报错, 在事务提交后,或者不使用相同的Connection的对象查询,不会报错。
建立保存点a1:savepoint a1;
............................[其间干了很多事]
再建立保存点a2:savepoint a2;
............................[又再干了很多事]
回滚到a2保存点:rollback to a2;
回滚到a1保存点:rollback to a1;
如果不指定保存点即为取消全部事务,如:rollback;
注意:如果建立保存点后执行过:commit语句,则为提出交事务,确认事务变化、结束事务、删除所有保存点、释放锁。
当使用commit语句结束事务后,其它会话将可以查看到事务变化后的新数据。
2、只读事务:transaction read only
一旦设定了只读事务(一般数据库管理员设定) ,则其它人提交上来的动作都不会看到。
如管理员操作:set transaction read only;
A用户操作增删改:。。。。。。(自已进行查询时可以看到所影响的数据)
B用户查询时:。。。。。。。。(看不到A用户进行过操作所影响的数据)
修改事务为读写的命令为:SET TRANSACTION READ WRITE;
3、在C#代码中使用Oracle的数据库事务
OracleTransaction类的概述
应用程序通过针对OracleConnection对象调用 BeginTransaction 来创建OracleTransaction对象。对OracleTransaction对象执行与该事务关联的所有后续操作(例如提交或中止该事务)。
OracleTransaction的成员主要有:
属性: Connection,指定与该事务关联的OracleConnection对象;
IsolationLevel,指定该事务的IsolationLevel;
枚举类型,用于对事物的锁定,取值有Chaos、ReadCommited、ReadUncommited、RepeatableRead、Serializable、Unspecified。
方法: Commit,提交SQL数据库事务;
Rollback , 从挂起状态回滚事务;
第一个示例:
public void 函数名称()
{
string strUpdateSql1 = "update 表名 set XH='...' where XH='...' and LCGZ_ID='...';
string strUpdateSql2 = "update 表名 set XH='...' where BZGZ_ID='...';
OracleConnection conn = new OracleConnection();
conn.ConnectionString = "数据库连接字符串";
conn.Open();
OracleTransaction updateProcess = conn.BeginTransaction();
try {
OracleCommand comm1 = conn.CreateCommand();
comm1.CommandText = strUpdateSql1;
comm1.Transaction = updateProcess;
comm1.ExecuteNonQuery();
OracleCommand comm2 = conn.CreateCommand();
comm2.CommandText = strUpdateSql2;
comm2.Transaction = updateProcess;
comm2.ExecuteNonQuery();
updateProcess.Commit();
}
catch()
{
updateProcess.Rollback();
}
finally { conn.Close(); } }
第二个示例: public static bool 函数名2(int fID)
{
OracleConnection conn = new OracleConnection();
conn.ConnectionString = "数据库连接字符串";
conn.Open();
OracleTransaction deleteProcess = conn.BeginTransaction();
try {
ArrayList alObjects = GetObjects();
foreach(object o in alObjects)
{
OracleCommand tmpComm = conn.CreateCommand();
tmpComm.Transaction = deleteProcess;
tmpComm.CommandText = "delete from 表1名 where BZGZ_ID="+o.ID;
tmpComm.ExecuteNonQuery();
OracleCommand tmpComm2 = conn.CreateCommand();
tmpComm2.Transaction = deleteProcess;
tmpComm2.CommandText = "delete from 表2名 where BZGZ_ID="+o.ID;
tmpComm2.ExecuteNonQuery();
}
OracleCommand comm = conn.CreateCommand();
comm.Transaction = deleteProcess;
comm.CommandText = "delete from 表3名 where LCGZ_ID="+fID;
comm.ExecuteNonQuery();
deleteProcess.Commit();
return true;
}
catch()
{
deleteProcess.Rollback();
return false;
}
finally { conn.Close(); }
=========================================================================
Connection一旦开了一个事务,则执行的命令就必须和事务相关 要注意的是,在事务进行中,不能再对同一个数据库连接(OracleConnection)再进行事务外的数据的查询和读取,
也就是说,类似下边的语句是不能执行的: OracleDataAdapter mAdp = new OracleDataAdapter(sSql, mCon); DataTable mDst = new DataTable(); mAdp.Fill(mDst);
而是得加一条语句,在事务内进行查询: OracleDataAdapter mAdp = new OracleDataAdapter(sSql, mCon); if (trans != null) mAdp.SelectCommand.Transaction = trans; DataTable mDst = new DataTable(); mAdp.Fill(mDst);
总结:在事务块内,如果使用同样的Connection对象查询,但不指定事务,会报错, 在事务提交后,或者不使用相同的Connection的对象查询,不会报错。
相关文章推荐
- Oraclee 事务处理以及在c#中使用oracle的事务处理
- [转载]C#中使用ADO.NET连接SQL Server数据库,自动增长字段用作主键,处理事务时的基本方法
- C#三层中oracle事务的使用
- c# + mysql + 事务处理(转载于 《C#数据库事务原理及实践》)
- 在python中使用cx_Oracle模块出现“DLL Load failed”的处理方法(转载)
- 在VB.NET使用OracleTransaction 处理事务
- VB.NET使用OracleTransaction处理事务
- C# 使用DataSet+dataAdapter操作后台数据库之事务处理方法1,欢迎拍砖
- C#.NET执行Oracle DBLink关于“ORA-02041: 客户数据库未开始一个事务处理”
- c#使用Transactions类完成多个数据库的事务操作(分布式事务处理)
- [转]c# + mysql + 事务处理(转载于 《C#数据库事务原理及实践》)
- [转]c# + mysql + 事务处理(转载于 《C#数据库事务原理及实践》)
- 在 .NET 中使用 Oracle 数据库事务(转载)
- 关于SQLserver2005事务和异常处理的联合处理以及在c#中的异常捕获
- T-SQL 存储过程中使用事务并回滚出错的SQL语句(C#事务处理)
- [原创]C#中使用ADO.NET连接SQL Server数据库,自动增长字段用作主键,处理事务时的基本方法
- jdbc,oracle使用事务提交处理
- Oracle 11g ORA-14450: 试图访问已经在使用的事务处理临时表
- C#中使用 Oracle的事务与存储过程
- 在Laravel中使用数据库事务以及事务失败后的异常处理