在博客上看到“系统设计应关注并发性 ”文章中提到的有关分布式异构数据库的事务处理,好象大家都没有办法。
就像大家都知道的,在一个事务Commit后,这个事务再进行Roolback已经是无效的了。
那么我们可以在事务未Cmmit之前就可以Catch到Exception的。
比如:目前有两个Connection :一个为本地SQL 数据库的Connection,叫LocalConnection,另一个是服务器上的Oracle的Connection叫OracleConnection。
当前LocalConnection上有两个操作,OracleConnection上也有两个操作,我们先把两个事务Open()
try
{
.
LocalCommand.ExecuteNonQuery() //LocalCommand为LocalConnection的一个Command
LocalCommand2.ExecuteNonQuery() //LocalCommand2为LocalConnection的一个Command
..
OracleCommand.ExecuteNonQuery() //OracleCommand为OracleConnection的一个Command
OracleCommand2.ExecuteNonQuery() //OracleCommand2为OracleConnection的一个Command
LocalConnection.Commit();
OracleConnection.Commit(); //两个事务提交
}catch
{
LocalConnection.Roolback();
OracleConnection.Roolback(); //两个事务回滚
}final
{
LocalConnection.Close();
OracleConnection.Close(); //两个连接Close()
}
{
.
LocalCommand.ExecuteNonQuery() //LocalCommand为LocalConnection的一个Command
LocalCommand2.ExecuteNonQuery() //LocalCommand2为LocalConnection的一个Command
..
OracleCommand.ExecuteNonQuery() //OracleCommand为OracleConnection的一个Command
OracleCommand2.ExecuteNonQuery() //OracleCommand2为OracleConnection的一个Command
LocalConnection.Commit();
OracleConnection.Commit(); //两个事务提交
}catch
{
LocalConnection.Roolback();
OracleConnection.Roolback(); //两个事务回滚
}final
{
LocalConnection.Close();
OracleConnection.Close(); //两个连接Close()
}
这样的话,如果有异常的话,两个事务都不会提交的。
不知道这样的方式,存不存在不正确的,欢迎大家讨论。
我在SPL中用这个这种方式实现的,测试也通过了。