Asp.net c#,在多个进程后回滚或提交
我想在多个进程之后使用Rollback()或commit()函数 没有错误,但它不会提交()以更新数据库 这是我的示例代码Asp.net c#,在多个进程后回滚或提交,asp.net,asp.net-mvc,advantage-database-server,Asp.net,Asp.net Mvc,Advantage Database Server,我想在多个进程之后使用Rollback()或commit()函数 没有错误,但它不会提交()以更新数据库 这是我的示例代码 public void startTransaction(){ using(Ads_A_Connection = new AdsConnection(Ads_A_connection_string)) using(Ads_B_Connection = new AdsConnection(Ads_B_connection_string)) {
public void startTransaction(){
using(Ads_A_Connection = new AdsConnection(Ads_A_connection_string))
using(Ads_B_Connection = new AdsConnection(Ads_B_connection_string))
{
Ads_A_Connection.Open();
Ads_B_Connection.Open();
AdsTransaction aTxn = Ads_A_Connection.BeginTransaction();
AdsTransaction bTxn = Ads_B_Connection.BeginTransaction();
try{
string aResult = this.process1(Ads_A_Connection);
this.process2(Ads_B_Connection, aResult);
this.process3(Ads_A_Connection. Ads_B_Connection);
aTxn.Commit();
bTxn.Commit();
// there is no error, but it couldn't commit.
}catch(Exception e){
aTxn.Rollback();
bTxn.Rollback();
}
}
}
public string process1(conn){
// Insert data
return result;
}
public void process2(conn. aResult){
// update
}
public void process3(aConn, bConn){
// delete
// update
}
我猜,这是因为超出了使用范围。因为我试着把所有的代码放进
startTransaction()方法,然后它就可以工作了。但是它看起来太脏了
在多个(方法)进程之后,如何使用rollback()或commit()
任何人都知道,请给我建议
谢谢
[编辑]
我只是在连接之前添加TransactionScope
using (TransactionScope scope = new TransactionScope())
{
using(Ads_A_Connection = new AdsConnection(Ads_A_connection_string))
using(Ads_B_Connection = new AdsConnection(Ads_B_connection_string))
{
.
.
但它出现了一个错误,它说“错误5047:事务命令的顺序无效。”
我需要一点提示:)交易范围是你的朋友
为了扩展Etch提到的内容,手动管理连接上的事务有几个问题:
- 您需要在方法周围传递SQL连接
- 完成后需要手动记住提交或回滚
- 如果在一个事务下要管理多个连接,则应该真正使用DTC或XA将事务注册到分布式/2阶段事务中
private void Method1()
{
using(Ads_A_Connection = new AdsConnection(Ads_A_connection_string))
{
Ads_A_Connection.Open();
string aResult = this.process1(Ads_A_Connection);
} // Can logically 'close' the connection here, although it is actually now held by the transaction manager
}
private void Method2()
{
using(Ads_B_Connection = new AdsConnection(Ads_B_connection_string))
{
Ads_B_Connection.Open();
this.process2(Ads_B_Connection, aResult);
} // Can logically 'close' the connection here, although it is actually now held by the transaction manager
}
public void MyServiceWhichNeedToBeTransactional(){
using(TransactionScope ts = new TransactionScope()) { // NB : Watch isolation here. Recommend change to READ_COMMITTED
try{
Method1();
Method2();
ts.Complete();
}
catch(Exception e){
// Do Logging etc. No need to rollback, as this is done by default if Complete() not called
}
}
}
首先提交内部/嵌套事务,然后提交外部事务re:5047-您是否已删除连接上的手动BeginTransaction()、commit()和Rollback()?这现在由TransactionScope.using System.Transactions管理;(C:\Program Files(x86)\Reference Assembly\Microsoft\Framework\.NETFramework\v4.5\System.Transactions.dll)