ADO.NET+ASP.NET+SQL--事务
2011-08-06 17:22
323 查看
ADO.NET 事务:
/// <summary>
/// 执行多条SQL语句,实现数据库事务。
/// </summary>
/// <param name="SQLStringList">多条SQL语句</param>
public static void ExecuteSqlTran(ArrayList SQLStringList)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection=conn;
SqlTransaction tx=conn.BeginTransaction();
cmd.Transaction=tx;
try
{
for(int n=0;n<SQLStringList.Count;n++)
{
string strsql=SQLStringList
.ToString();
if (strsql.Trim().Length>1)
{
cmd.CommandText=strsql;
cmd.ExecuteNonQuery();
}
}
tx.Commit();
}
catch(System.Data.SqlClient.SqlException E)
{
tx.Rollback();
throw new Exception(E.Message);
}
}
}
---------------------------------------------------
分割线
---------------------------------------------------
ASP.NET 事物:
public static void ExecuteTransaction()
{
TransactionOptions transactionOption= new TransactionOptions();
transactionOption.IsolationLevel= System.Transactions.IsolationLevel.ReadCommitted;
using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
{
//DO YOUR METHODS here
transactionScope.Complete();
}
}
可以有返回值,改一下:
public static bool ExecuteTransaction()
{
bool hasTranscationCommitted = false;
TransactionOptions transactionOption= new TransactionOptions();
transactionOption.IsolationLevel= System.Transactions.IsolationLevel.ReadCommitted;
try
{
using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required,transactionOption))
{
//DO YOUR METHODS here
transactionScope.Complete();
hasTranscationCommitted = true;
}
}
catch //or catch TransactionAbortedException and return error string
{
hasTranscationCommitted = false;
}
return hasTranscationCommitted;
}
1.如果是分布式transaction,transaction不能正常运行话需要配置服务器DTC(Distributed Transaction Coordinator。如何配置你查一下相关文档
2.在本机运行的话可能没有问题。但如果clint,server不是同一电脑,Transaction不能正常运行的话,
需要在服务器管理工具-> Component ->My Computers ->My Computer ->属性-> MSDTC ->安全设置 里面允许网络访问;Allow inBound and outBound
如果可以正常运行则不必配置。
Distributed Transaction比较复杂,有问题需要根据问题的exception来查找,不一定都能从上面的方法解决。
---------------------------------------------------
分割线
---------------------------------------------------
存储过程 事物:
[SQL server]存储过程事务
CREATE PROCEDURE testPro
AS
BEGIN TRANSACTION tran_test
SAVE TRANSACTION tran_test
INSERT [table1] ( [content] ) VALUES ( '43332' )
COMMIT TRANSACTION tran_test
IF ( @@ERROR <> 0 )
BEGIN
RAISERROR( 'Insert data error!',16,1 )
ROLLBACK TRANSACTION tran_test
END
IF ( @@TRANCOUNT > 0 )
BEGIN
ROLLBACK TRANSACTION tran_test
END
GO
举个事务操作的简单例子。
SQL SERVER存储过程中使用事务
Create PROCEDURE UpdateWanjun
@UserName nvarchar(500),
@UserPassword nvarchar(500),
@ReturnVal int output
AS
--Set XAcT_ABORT ON
Begin Transaction T
Update admins set UserPassword = @UserPassword where UserName = @UserName
Update admins set UserPassword = @UserPassword,a='aaadfasdfasdfas' where id=4 --出错语句 ,a为int型,大小为默认值4
--set @ReturnVal=@@Rowcount(这个变量,只能在紧挨着它的上面SQL下起作用,这样才能返回值,只有放在Update下面才管用)
IF @@Error <> 0
Begin
Print '111'
RollBack Transaction T
End
Else
print '222'
COMMIT Transaction T
GO
####################################################################################
如果在一个存储过程中执行调用另一个服务器上的存储过程时,添加事务时需要使用
BEGIN DISTRIBUTED TRANSACTION来开始事务(分布式事务)
BEGIN DISTRIBUTED TRAN [ SACTION ]
[ transaction_name | @tran_name_variable ]
参数
transaction_name
是用户定义的事务名,用于跟踪 MS DTC 实用工具中的分布式事务。transaction_name 必须符合标识符规则,但是仅使用头 32 个字符。
@tran_name_variable
是用户定义的一个变量名,它含有一个事务名,该事务名用于跟踪 MS DTC 实用工具中的分布式事务。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。
注释
执行 BEGIN DISTRIBUTED TRANSACTION 语句的服务器是事务创建人,并且控制事务的完成。当连接发出后续 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句时,主控服务器请求 MS DTC 在所涉及的服务器间管理分布式事务的完成。
有两个方法可将远程 SQL 服务器登记在一个分布式事务中:
分布式事务中已登记的连接执行一个远程存储过程调用,该调用引用一个远程服务器。
分布式事务中已登记的连接执行一个分布式查询,该查询引用一个远程服务器。
例如,如果在 ServerA 上发出 BEGIN DISTRIBUTED TRANSACTION,该连接调用 ServerB 上的存储过程和 ServerC 上的另一个存储过程,并且 ServerC 上的存储过程对 ServerD 执行一个分布式查询,那么四个 SQL 服务器都进入分布式事务中了。ServerA 是该事务的创建者和控制服务器。
分布式事务 Transact-SQL 涉及的连接并不获取可以传给另一个连接的事务对象,从而也不能用该方法显式登记在分布式事务中。远程服务器登记到事务中的唯一方法是成为远程存储过程调用或分布式查询的目标。
默认情况下,任何有效用户都拥有 BEGIN DISTRIBUTED TRANSACTION 权限。
/// <summary>
/// 执行多条SQL语句,实现数据库事务。
/// </summary>
/// <param name="SQLStringList">多条SQL语句</param>
public static void ExecuteSqlTran(ArrayList SQLStringList)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection=conn;
SqlTransaction tx=conn.BeginTransaction();
cmd.Transaction=tx;
try
{
for(int n=0;n<SQLStringList.Count;n++)
{
string strsql=SQLStringList
.ToString();
if (strsql.Trim().Length>1)
{
cmd.CommandText=strsql;
cmd.ExecuteNonQuery();
}
}
tx.Commit();
}
catch(System.Data.SqlClient.SqlException E)
{
tx.Rollback();
throw new Exception(E.Message);
}
}
}
---------------------------------------------------
分割线
---------------------------------------------------
ASP.NET 事物:
public static void ExecuteTransaction()
{
TransactionOptions transactionOption= new TransactionOptions();
transactionOption.IsolationLevel= System.Transactions.IsolationLevel.ReadCommitted;
using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
{
//DO YOUR METHODS here
transactionScope.Complete();
}
}
可以有返回值,改一下:
public static bool ExecuteTransaction()
{
bool hasTranscationCommitted = false;
TransactionOptions transactionOption= new TransactionOptions();
transactionOption.IsolationLevel= System.Transactions.IsolationLevel.ReadCommitted;
try
{
using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required,transactionOption))
{
//DO YOUR METHODS here
transactionScope.Complete();
hasTranscationCommitted = true;
}
}
catch //or catch TransactionAbortedException and return error string
{
hasTranscationCommitted = false;
}
return hasTranscationCommitted;
}
1.如果是分布式transaction,transaction不能正常运行话需要配置服务器DTC(Distributed Transaction Coordinator。如何配置你查一下相关文档
2.在本机运行的话可能没有问题。但如果clint,server不是同一电脑,Transaction不能正常运行的话,
需要在服务器管理工具-> Component ->My Computers ->My Computer ->属性-> MSDTC ->安全设置 里面允许网络访问;Allow inBound and outBound
如果可以正常运行则不必配置。
Distributed Transaction比较复杂,有问题需要根据问题的exception来查找,不一定都能从上面的方法解决。
---------------------------------------------------
分割线
---------------------------------------------------
存储过程 事物:
[SQL server]存储过程事务
CREATE PROCEDURE testPro
AS
BEGIN TRANSACTION tran_test
SAVE TRANSACTION tran_test
INSERT [table1] ( [content] ) VALUES ( '43332' )
COMMIT TRANSACTION tran_test
IF ( @@ERROR <> 0 )
BEGIN
RAISERROR( 'Insert data error!',16,1 )
ROLLBACK TRANSACTION tran_test
END
IF ( @@TRANCOUNT > 0 )
BEGIN
ROLLBACK TRANSACTION tran_test
END
GO
举个事务操作的简单例子。
SQL SERVER存储过程中使用事务
Create PROCEDURE UpdateWanjun
@UserName nvarchar(500),
@UserPassword nvarchar(500),
@ReturnVal int output
AS
--Set XAcT_ABORT ON
Begin Transaction T
Update admins set UserPassword = @UserPassword where UserName = @UserName
Update admins set UserPassword = @UserPassword,a='aaadfasdfasdfas' where id=4 --出错语句 ,a为int型,大小为默认值4
--set @ReturnVal=@@Rowcount(这个变量,只能在紧挨着它的上面SQL下起作用,这样才能返回值,只有放在Update下面才管用)
IF @@Error <> 0
Begin
Print '111'
RollBack Transaction T
End
Else
print '222'
COMMIT Transaction T
GO
####################################################################################
如果在一个存储过程中执行调用另一个服务器上的存储过程时,添加事务时需要使用
BEGIN DISTRIBUTED TRANSACTION来开始事务(分布式事务)
BEGIN DISTRIBUTED TRAN [ SACTION ]
[ transaction_name | @tran_name_variable ]
参数
transaction_name
是用户定义的事务名,用于跟踪 MS DTC 实用工具中的分布式事务。transaction_name 必须符合标识符规则,但是仅使用头 32 个字符。
@tran_name_variable
是用户定义的一个变量名,它含有一个事务名,该事务名用于跟踪 MS DTC 实用工具中的分布式事务。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。
注释
执行 BEGIN DISTRIBUTED TRANSACTION 语句的服务器是事务创建人,并且控制事务的完成。当连接发出后续 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句时,主控服务器请求 MS DTC 在所涉及的服务器间管理分布式事务的完成。
有两个方法可将远程 SQL 服务器登记在一个分布式事务中:
分布式事务中已登记的连接执行一个远程存储过程调用,该调用引用一个远程服务器。
分布式事务中已登记的连接执行一个分布式查询,该查询引用一个远程服务器。
例如,如果在 ServerA 上发出 BEGIN DISTRIBUTED TRANSACTION,该连接调用 ServerB 上的存储过程和 ServerC 上的另一个存储过程,并且 ServerC 上的存储过程对 ServerD 执行一个分布式查询,那么四个 SQL 服务器都进入分布式事务中了。ServerA 是该事务的创建者和控制服务器。
分布式事务 Transact-SQL 涉及的连接并不获取可以传给另一个连接的事务对象,从而也不能用该方法显式登记在分布式事务中。远程服务器登记到事务中的唯一方法是成为远程存储过程调用或分布式查询的目标。
默认情况下,任何有效用户都拥有 BEGIN DISTRIBUTED TRANSACTION 权限。
相关文章推荐
- 事务的两种用法(1.在SQL中写存储过程 2.在ADO.NET中处理)各有优点
- ADO.NET 对 Microsoft SQL Server 的事务逻辑
- Asp.net中的事务处理(sql)
- T-SQL中的事务处理、ADO.NET中的事务处理、LINQ to SQL中的隐式事务处理、分布式事务处理
- SQL本地事务、asp.net事务、DTC
- ASP.NET 3.5核心编程学习笔记(23):Linq-to-SQL 数据的更新、事务、存储过程、函数
- SQL 和存储过程级别的事务及ADO.NET级别的事务
- ADO.NET 2.0中新的事务处理机制的引入带来前所未有的新体验(给所有不了解TransactionScope的朋友,以及还在用SqlTransaction的朋友)
- 《传智播客.Net培训.net视频教程》(.net视频asp.net培训传智播客asp.net视频教程开放课程c#视频移动开发winform SQL ADO.Net HTML JavaScript
- 黑马程序员之ADO.NET学习笔记: SqlTransaction(事务)
- SQL事务与ADO.NET事务
- SQL事务与ADO.NET事务
- EXTASPNET C# ASP.NET sql server 事务超时,解决方法
- asp.net的sql事务处理
- ASP.NET里的事务处理(ado.net 数据库应用)
- sqldatareader返回数据集,并要求使用ADO.net事务的解决方案
- ADO.NET ASP.NET 将 SQLDatareader 转换成 List
- ADO.NET—Asp.net 用DataSet对象更新数据(SqlDataAdapter)
- LinqToSql和ASP.NET Entity FrameWork 中使用事务
- ADO.NET—Asp.net 用DataSet对象更新数据(SqlDataAdapter)