<%@ Page Language="" %>在这种方法中,需要调用SqlConnection对象的EnlistTransaction()方法(传递CommittableTransaction对象作为参数),以便将SqlConnection对象与CommittableTransaction对象关联起来。一旦完成这个工作,然后就可以通过调用CommittableTransaction对象的Commit()和Rollback()方法,显式提交或者回滚事务。正如能够想象的,不推荐使用这种手动方法,因为当发生不同类型的异常时,可能会遇到一些无法回滚事务的风险。 使用TransactionScope类
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Transactions" %>
<%@ Import Namespace="System.Web.Configuration" %>
<script runat="server">
void btnSave_Click(object sender, EventArgs e)
{
CommittableTransaction trans = new CommittableTransaction();
try
{
string connectionString = WebConfigurationManager.ConnectionStrings
["Mydatabase"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{
string sql = "Insert into Production.ProductCategory(Name," +
"rowguid, ModifiedDate) Values(@Name, @rowguid, @ModifiedDate)";
// 打开连接,在事务范围中登记此连接
connection.Open();
SqlCommand command = new SqlCommand(sql, connection);
command.CommandType = CommandType.Text;
SqlParameter nameParam =
new SqlParameter("@Name", SqlDbType.NVarChar, 50);
nameParam.Value = txtCategoryName.Text;
command.Parameters.Add(nameParam);
SqlParameter guidParam = new SqlParameter("@rowguid",
SqlDbType.UniqueIdentifier);
guidParam.Value = System.Guid.NewGuid();
command.Parameters.Add(guidParam);
SqlParameter modifieDateParam = new SqlParameter("@ModifiedDate",
SqlDbType.DateTime);
modifieDateParam.Value = System.DateTime.Now;
command.Parameters.Add(modifieDateParam);
//在当前事务的范围中登记事务
connection.EnlistTransaction(trans);
command.ExecuteNonQuery();
// 如果每一个执行都成功,则提交事务
trans.Commit();
}
lblResult.Text = "Category is written successfully";
}
catch (Exception ex)
{
// 如果出现异常,则回滚事务
trans.Rollback();
lblResult.Text = "Exception is : " + ex.Message;
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Using Explicit Transactions using CommittableTransaction</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblCategoryName" runat="server"
Text="Category Name:" Width="179px"></asp:Label>
<asp:TextBox ID="txtCategoryName" runat="server" />
<asp:Button ID="btnSave" runat="server" Text="Save" Width="92px"
OnClick="btnSave_Click" />
<br /><br />
<asp:Label ID="lblResult" runat="server" Font-Bold="true"
Font-Size="Small" />
</div>
</form>
</body>
</html>
using(TransactionScope scope = new TransactionScope())示例2列举了一种在.NET 2.0中创建事务的方法。在TransactionScope对象定义的代码块中创建和释放该对象。使用TransactionScope对象的构造函数和TransactionScopeOption枚举,开发人员能够定义是否需要新事务,或者是否应该使用已经在外部块中存在的事务。TransactionScope.Complete()方法指示事务范围内的所有操作都已成功完成。在using语句结尾处(调用Dispose()方法的位置),定义了事务块的输出。如果由于发生异常而没有调用Complete()方法,那么放弃事务。如果在事务范围内成功完成,则如果事务是根事务,那么当事务是根事务时就提交事务。如果范围内的不是根事务,那么会影响事务输出。
{
/*在这里实现事务性工作 */
// 没有错误——提交事务
scope.Complete();
}
<%@ Page Language="" %>在示例2中,对于Mydatabase数据库执行插入的SQL语句包括在使用using块的TransactionScope对象中。InsertCategroy()方法执行实际的向ProductCategory表插入新记录的工作。在插入记录后,该方法向调用者返回新近插入记录的标识值(类别ID列)。一旦代码成功执行,则调用TransactionScope对象的Complete()方法,以便告知.NET Framework语句已经成功执行完成,事务导致的结果将提交给数据库。
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Transactions" %>
<%@ Import Namespace="System.Web.Configuration" %>
<script runat="server">
void btnSave_Click(object sender, EventArgs e)
{
try
{
int categoryID;
string connectionString = WebConfigurationManager.ConnectionStrings
["Mydatabase"].ConnectionString;
using (TransactionScope scope = new TransactionScope())
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
categoryID = InsertCategory(connection);
}
// 提交事务
scope.Complete();
}
lblResult.Text =
"Category is written successfully*****Category ID= " +
categoryID.ToString();
}
catch (Exception ex)
{
lblResult.Text = "Exception is : " + ex.Message;
}
}
int InsertCategory(SqlConnection connection)
{
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Implicit Transactions using TransactionScope</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblCategoryName" runat="server" Text="Category Name:"
Width="179px"></asp:Label>
<asp:TextBox ID="txtCategoryName" runat="server" />
<asp:Button ID="btnSave" runat="server" Text="Save" Width="92px"
OnClick="btnSave_Click" />
<br />
<br />
<asp:Label ID="lblResult" runat="server" Font-Bold="true"
Font-Size="Small" />
</div>
</form>
</body>
</html>
<%@ Page Transaction="Required" %>如果省略Transaction属性,页面则禁用事务。使用System.EnterpriseServices.ContextUtil类的静态方法在ASP.NET页面中提交或者放弃事务。这些静态方法是SetComplete()和SetAbort()(它们分别对应Page事件CommitTransaction()和AbortTransaction())。以下代码列举了页面实现框架,该页面将Page指令的Transaction属性设置为Required,同时在CommitTransaction()和AbortTransaction()事件中,编写处理事务结果所需的代码。
void Page_Load(object sender, System.EventArgs e)4. 何时使用事务
{
AbortTransaction += new System.EventHandler(AbortTransactionEvent);
CommitTransaction += new System.EventHandler(CommitTransactionEvent);
try
{
/* 在这里放置事务性代码 */
ContextUtil.SetComplete();
}
catch(Exception)
{
ContextUtil.SetAbort();
}
}
void AbortTransactionEvent(object sender,System.EventArgs e)
{
/*用于回滚行为的代码*/
}
void CommitTransactionEvent(object sender,System.EventArgs e)
{
/*用于提交行为的代码*/
}
文档说明:
相关文档
返回首页 | 关于本站 | | 友情链接 | 广告服务 | 意见建议 | 访客留言 | 本站论坛
Copyright© 2001-2006 ProgramBBS.com All Rights Reserved 版权所有©编程论坛
Email: 吉ICP备05009985号
感谢长春订餐网友情支持