Concurrent Connections / Shared Transaction

S

Shawn B.

Greetings,

I have two SqlCommands objects that each need to execute concurrently but I
want them both to be a part of the same transaction.

What I'm doing is created one SqlCommand and Beginning a transaction.

I have another SqlCommand that is being executed from within an Asynchronous
delegate that needs to participate in the same transaction. The problem is
that I get the infamous exception stating that the connection is already in
use.

COM+ is not an answer here.

What I want to know is if there is a way to make this work correctly using
only ADO.NET?


Thanks,
Shawn
 
D

Dumitru Sbenghe

Given the current status of ADO.NET (version 1.1), you can not do what you
want. Because the SqlClient provider permit only one command running on a
given connection at a time, the only solution will be a distributed
transaction coordinator + 2 connections with 2 commands executed
concurrently aka ES/COM+ in .NET . or wait until ADO.NET 2.0 will be
released :), version which will permit this behavior.



Dumitru
 
A

Angel Saenz-Badillos[MS]

As long as both connections are to the same instance of Sql Server you can
use sp_bindsession to get this behavior without having to use distributed
transactions.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sp_ba-bz_9ini.asp

Hope this helps.
--
Angel Saenz-Badillos [MS] Managed Providers
This posting is provided "AS IS", with no warranties, and confers no
rights.Please do not send email directly to this alias.
This alias is for newsgroup purposes only.
I am now blogging about ADO.NET: http://weblogs.asp.net/angelsb/
 
S

Shawn B.

Angel, you are amazing. I read your blog frequently, this is certainly in
your area of expertise. Thanks for the help.


Thanks,
Shawn.



Angel Saenz-Badillos said:
As long as both connections are to the same instance of Sql Server you can
use sp_bindsession to get this behavior without having to use distributed
transactions.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sp_ba-bz_9ini.asp

Hope this helps.
--
Angel Saenz-Badillos [MS] Managed Providers
This posting is provided "AS IS", with no warranties, and confers no
rights.Please do not send email directly to this alias.
This alias is for newsgroup purposes only.
I am now blogging about ADO.NET: http://weblogs.asp.net/angelsb/




Dumitru Sbenghe said:
Given the current status of ADO.NET (version 1.1), you can not do what you
want. Because the SqlClient provider permit only one command running on a
given connection at a time, the only solution will be a distributed
transaction coordinator + 2 connections with 2 commands executed
concurrently aka ES/COM+ in .NET . or wait until ADO.NET 2.0 will be
released :), version which will permit this behavior.



Dumitru
 
P

Pablo Castro [MS]

Actually, bound sessions allow you to share the transaction space among two
connections but doesn't give you concurrent access to it. If you try to
execute a batch on a connection while the other is actively doing something
within the transaction the server will return an error saying that the
transaction context is in use.

COM+ is the only solution I know of for this scenario. Even with COM+/DTC
you'll see some serialization around the transaction. In ADO.NET 2.0 + SQL
Server 2005 you can mix MARS plus asynchronous command execution to submit
two requests concurrently within the same transaction; however, note that in
that case you won't get parallelism in the server; multiple MARS sessions
within a connection are interleaved, not executed in parallel.

--
Pablo Castro
Program Manager - ADO.NET Team
Microsoft Corp.

This posting is provided "AS IS" with no warranties, and confers no rights.


Angel Saenz-Badillos said:
As long as both connections are to the same instance of Sql Server you can
use sp_bindsession to get this behavior without having to use distributed
transactions.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sp_ba-bz_9ini.asp

Hope this helps.
--
Angel Saenz-Badillos [MS] Managed Providers
This posting is provided "AS IS", with no warranties, and confers no
rights.Please do not send email directly to this alias.
This alias is for newsgroup purposes only.
I am now blogging about ADO.NET: http://weblogs.asp.net/angelsb/




Dumitru Sbenghe said:
Given the current status of ADO.NET (version 1.1), you can not do what
you
want. Because the SqlClient provider permit only one command running on a
given connection at a time, the only solution will be a distributed
transaction coordinator + 2 connections with 2 commands executed
concurrently aka ES/COM+ in .NET . or wait until ADO.NET 2.0 will be
released :), version which will permit this behavior.



Dumitru
 
A

Angel Saenz-Badillos[MS]

That's why Pablo gets paid the big bucks :) Seriously if you want the best
info always look for his posts and articles.

He is completelly correct by the way, you will not be able to use this with
concurrently operating connections, sorry.
--
Angel Saenz-Badillos [MS] Managed Providers
This posting is provided "AS IS", with no warranties, and confers no
rights.Please do not send email directly to this alias.
This alias is for newsgroup purposes only.
I am now blogging about ADO.NET: http://weblogs.asp.net/angelsb/




Pablo Castro said:
Actually, bound sessions allow you to share the transaction space among two
connections but doesn't give you concurrent access to it. If you try to
execute a batch on a connection while the other is actively doing something
within the transaction the server will return an error saying that the
transaction context is in use.

COM+ is the only solution I know of for this scenario. Even with COM+/DTC
you'll see some serialization around the transaction. In ADO.NET 2.0 + SQL
Server 2005 you can mix MARS plus asynchronous command execution to submit
two requests concurrently within the same transaction; however, note that in
that case you won't get parallelism in the server; multiple MARS sessions
within a connection are interleaved, not executed in parallel.

--
Pablo Castro
Program Manager - ADO.NET Team
Microsoft Corp.

This posting is provided "AS IS" with no warranties, and confers no rights.


Angel Saenz-Badillos said:
As long as both connections are to the same instance of Sql Server you can
use sp_bindsession to get this behavior without having to use distributed
transactions.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sp_ba-bz_9ini.asp

Hope this helps.
--
Angel Saenz-Badillos [MS] Managed Providers
This posting is provided "AS IS", with no warranties, and confers no
rights.Please do not send email directly to this alias.
This alias is for newsgroup purposes only.
I am now blogging about ADO.NET: http://weblogs.asp.net/angelsb/




Dumitru Sbenghe said:
Given the current status of ADO.NET (version 1.1), you can not do what
you
want. Because the SqlClient provider permit only one command running on a
given connection at a time, the only solution will be a distributed
transaction coordinator + 2 connections with 2 commands executed
concurrently aka ES/COM+ in .NET . or wait until ADO.NET 2.0 will be
released :), version which will permit this behavior.



Dumitru


Greetings,

I have two SqlCommands objects that each need to execute concurrently but
I
want them both to be a part of the same transaction.

What I'm doing is created one SqlCommand and Beginning a transaction.

I have another SqlCommand that is being executed from within an
Asynchronous
delegate that needs to participate in the same transaction. The
problem
is
that I get the infamous exception stating that the connection is
already
in
use.

COM+ is not an answer here.

What I want to know is if there is a way to make this work correctly using
only ADO.NET?


Thanks,
Shawn
 
S

Shawn B.

What do you mean by interleaved? Do you mean that one will execute and
complete and then the other command in the transaction will execute and
complete and then the next one, from a queue of some sort? versus executing
parallel?


Thanks,
Shawn


Pablo Castro said:
Actually, bound sessions allow you to share the transaction space among two
connections but doesn't give you concurrent access to it. If you try to
execute a batch on a connection while the other is actively doing something
within the transaction the server will return an error saying that the
transaction context is in use.

COM+ is the only solution I know of for this scenario. Even with COM+/DTC
you'll see some serialization around the transaction. In ADO.NET 2.0 + SQL
Server 2005 you can mix MARS plus asynchronous command execution to submit
two requests concurrently within the same transaction; however, note that in
that case you won't get parallelism in the server; multiple MARS sessions
within a connection are interleaved, not executed in parallel.

--
Pablo Castro
Program Manager - ADO.NET Team
Microsoft Corp.

This posting is provided "AS IS" with no warranties, and confers no rights.


Angel Saenz-Badillos said:
As long as both connections are to the same instance of Sql Server you can
use sp_bindsession to get this behavior without having to use distributed
transactions.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sp_ba-bz_9ini.asp

Hope this helps.
--
Angel Saenz-Badillos [MS] Managed Providers
This posting is provided "AS IS", with no warranties, and confers no
rights.Please do not send email directly to this alias.
This alias is for newsgroup purposes only.
I am now blogging about ADO.NET: http://weblogs.asp.net/angelsb/




Dumitru Sbenghe said:
Given the current status of ADO.NET (version 1.1), you can not do what
you
want. Because the SqlClient provider permit only one command running on a
given connection at a time, the only solution will be a distributed
transaction coordinator + 2 connections with 2 commands executed
concurrently aka ES/COM+ in .NET . or wait until ADO.NET 2.0 will be
released :), version which will permit this behavior.



Dumitru


Greetings,

I have two SqlCommands objects that each need to execute concurrently but
I
want them both to be a part of the same transaction.

What I'm doing is created one SqlCommand and Beginning a transaction.

I have another SqlCommand that is being executed from within an
Asynchronous
delegate that needs to participate in the same transaction. The
problem
is
that I get the infamous exception stating that the connection is
already
in
use.

COM+ is not an answer here.

What I want to know is if there is a way to make this work correctly using
only ADO.NET?


Thanks,
Shawn
 
P

Pablo Castro [MS]

In MARS there are fixed interleave points in the server. For DML statements
(e.g. UPDATEs), the whole statement will run without yielding. For SELECT,
FETCH and a few other statements we'll yield on network writes so if we
return lots of rows you'll see intra-statement interleaving.

There is a great article on MARS here which includes more details on how
statements are interleaved:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsql90/html/MARSinSQL05.asp

--
Pablo Castro
Program Manager - ADO.NET Team
Microsoft Corp.

This posting is provided "AS IS" with no warranties, and confers no rights.


Shawn B. said:
What do you mean by interleaved? Do you mean that one will execute and
complete and then the other command in the transaction will execute and
complete and then the next one, from a queue of some sort? versus
executing
parallel?


Thanks,
Shawn


Pablo Castro said:
Actually, bound sessions allow you to share the transaction space among two
connections but doesn't give you concurrent access to it. If you try to
execute a batch on a connection while the other is actively doing something
within the transaction the server will return an error saying that the
transaction context is in use.

COM+ is the only solution I know of for this scenario. Even with COM+/DTC
you'll see some serialization around the transaction. In ADO.NET 2.0 +
SQL
Server 2005 you can mix MARS plus asynchronous command execution to
submit
two requests concurrently within the same transaction; however, note that in
that case you won't get parallelism in the server; multiple MARS sessions
within a connection are interleaved, not executed in parallel.

--
Pablo Castro
Program Manager - ADO.NET Team
Microsoft Corp.

This posting is provided "AS IS" with no warranties, and confers no rights.


message
As long as both connections are to the same instance of Sql Server you can
use sp_bindsession to get this behavior without having to use distributed
transactions.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sp_ba-bz_9ini.asp

Hope this helps.
--
Angel Saenz-Badillos [MS] Managed Providers
This posting is provided "AS IS", with no warranties, and confers no
rights.Please do not send email directly to this alias.
This alias is for newsgroup purposes only.
I am now blogging about ADO.NET: http://weblogs.asp.net/angelsb/




Given the current status of ADO.NET (version 1.1), you can not do what
you
want. Because the SqlClient provider permit only one command running
on a
given connection at a time, the only solution will be a distributed
transaction coordinator + 2 connections with 2 commands executed
concurrently aka ES/COM+ in .NET . or wait until ADO.NET 2.0 will be
released :), version which will permit this behavior.



Dumitru


Greetings,

I have two SqlCommands objects that each need to execute
concurrently
but
I
want them both to be a part of the same transaction.

What I'm doing is created one SqlCommand and Beginning a
transaction.

I have another SqlCommand that is being executed from within an
Asynchronous
delegate that needs to participate in the same transaction. The
problem
is
that I get the infamous exception stating that the connection is
already
in
use.

COM+ is not an answer here.

What I want to know is if there is a way to make this work correctly
using
only ADO.NET?


Thanks,
Shawn
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top