[英]Why my Transaction doesn't work?
我有一个方法(带有WebMethod
属性),定义了一个事务,在我的方法中,在我的事务中,我调用了2个存储过程,第一个是GetAllBook
:
select *
from Book_TBL
where IsActive = 'True'
第二个是updateBook
:
update Book_TBL
set IsActive = 'False'
where IsActive = 'True'
和我的方法:
public struct BOOK
{
public string BOOK_NAME;
public string BOOK_DESC;
}
[WebMethod]
public static List<BOOK> GetMyBooks()
{
using (TransactionScope _transactionScope = new TransactionScope(TransactionScopeOption.Required))
{
string _connString = "Data Source=.;Initial Catalog=BookStore;Integrated Security=True";
SqlConnection _conn = new SqlConnection(_connString);
_conn.Open();
SqlCommand _com = new SqlCommand();
_com.CommandType = System.Data.CommandType.StoredProcedure;
_com.CommandText = "GetAllBook";
_com.Connection = _conn;
SqlDataAdapter bookdataAdapter = new SqlDataAdapter(_com);
DataSet bookDS = new DataSet();
bookdataAdapter.Fill(bookDS, "Book_TBL");
List<BOOK> bookList = new List<BOOK>();
_conn.Close();
BOOK book;
foreach (DataRow dr in bookDS.Tables["Book_TBL"].Rows)
{
book = new BOOK();
book.BOOK_NAME = dr["book_name"].ToString();
book.BOOK_DESC = dr["book_desc"].ToString();
bookList.Add(book);
}
SqlCommand updateCommand= new SqlCommand();
_conn.Open();
updateCommand.CommandText = "updateBook";
updateCommand.CommandType = System.Data.CommandType.StoredProcedure;
updateCommand.Connection = _conn;
updateCommand.ExecuteNonQuery();
_conn.Close();
return bookList;
}
}
当我运行项目时, myMethod
给我列出了具有IsActive = True
的书的列表,但它没有更新我的表! 问题是什么?
您必须调用TransactionScope.Complete
,相当于一个提交。 没有它,using块会处理它,这等效于回滚。
我不知道用这种深层嵌套的方法您真正想做什么,但您应该首先将所有内容放到位:
public class Book
{
public string Name { get; set; }
public string Description { get; set; }
}
public static List<Book> GetMyBooks()
{
var bookList = new List<Book>();
using (var transactionScope = new TransactionScope(TransactionScopeOption.Required))
{
const string connString = "Data Source=.;Initial Catalog=BookStore;Integrated Security=True";
using (var conn = new SqlConnection(connString))
{
using (var com = new SqlCommand())
{
com.CommandType = CommandType.StoredProcedure;
com.CommandText = "GetAllBook";
com.Connection = conn;
using (var bookdataAdapter = new SqlDataAdapter(com))
{
using (var bookDataSet = new DataSet())
{
bookdataAdapter.Fill(bookDataSet, "Book_TBL");
foreach (DataRow dr in bookDataSet.Tables["Book_TBL"].Rows)
{
bookList.Add(new Book
{
Name = dr["book_name"].ToString(),
Description = dr["book_desc"].ToString()
});
}
using (var updateCommand = new SqlCommand())
{
updateCommand.CommandText = "updateBook";
updateCommand.CommandType = CommandType.StoredProcedure;
updateCommand.Connection = conn;
updateCommand.ExecuteNonQuery();
}
}
}
}
}
transactionScope.Complete();
return bookList;
}
}
如前所述,您还必须手动提交事务。
您应该像这样使用SqlTransaction
类:
using (SqlConnection cn = new SqlConnection())
{
cn.Open();
using (SqlTransaction tr = cn.BeginTransaction())
{
//some code
tr.Commit();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.