SQL Server Transactions 如何提交我的事务

标签 sql sql-server sql-server-2005

我有 SQL Server 2005 存储过程。有人在事务中调用我的存储过程。在我的存储过程中,我正在记录一些信息(插入到表中)。当更高级别的事务回滚时,它会删除我的插入。

无论如何我可以提交我的插入并防止更高级别的回滚删除我的插入吗?

谢谢

最佳答案

即使你开始一个新的事务,它也会被嵌套在外层事务中。 SQL Server 保证回滚将导致未修改的数据库状态。因此,您无法在中止的事务中插入一行。

这里有一个解决方法,有点小技巧。使用 rpc out = true 创建链接服务器和 remote proc transaction promotion = false .链接服务器可以指向与您的过程运行所在的同一台服务器。然后,您可以使用 execte (<query>) at <server>在新事务中执行某些操作。

if OBJECT_ID('logs') is not null drop table logs
create table logs (id int primary key identity, msg varchar(max))
if OBJECT_ID('TestSp') is not null drop procedure TestSp
go
create procedure TestSp as
execute ('insert into dbo.logs (msg) values (''test message'')') at LINKEDSERVER
go
begin transaction
exec TestSp
rollback transaction
select top 10 * from logs

这将以日志表中的一行结束,即使事务已回滚。

以下是创建此类链接服务器的示例代码:

IF  EXISTS (SELECT srv.name FROM sys.servers srv WHERE srv.server_id != 0 AND 
        srv.name = N'LINKEDSERVER')
    EXEC master.dbo.sp_dropserver @server=N'LINKEDSERVER', 
        @droplogins='droplogins'
EXEC master.dbo.sp_addlinkedserver @server = N'LINKEDSERVER', 
    @srvproduct=N'LOCALHOST', @provider=N'SQLNCLI', @datasrc=N'LOCALHOST', 
    @catalog=N'DatabaseName'
EXEC master.dbo.sp_serveroption @server=N'LINKEDSERVER', @optname=N'rpc out', 
     @optvalue=N'true'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'LINKEDSERVER', 
    @useself=N'True', @locallogin=NULL,@rmtuser=NULL, @rmtpassword=NULL
EXEC master.dbo.sp_serveroption @server=N'LINKEDSERVER', 
    @optname=N'remote proc transaction promotion', @optvalue=N'false'

关于SQL Server Transactions 如何提交我的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2876568/

相关文章:

SQL:一个查询中有两个选择语句

mysql 查询 - 重复结果的问题

sql-server - SQL Server 2008 - 如何从表值函数返回用户定义的表类型?

SQL 查询查找数据库中具有特定名称列的所有表

c# - SELECT 和 UPDATE 表,因此没有线程重叠

带连接的 SQL 更新?

sql - 如果其他字段相同,Postgres 非唯一,否则唯一?

sql - 美国 Zip(邮政编码)的 Mysql 数据类型

PHP 从 MySQL 到 SQL Server 的语法差异

sql-server-2005 - 用户无权运行 DBCC DBREINDEX