Laboratorios DNA

Download Report

Transcript Laboratorios DNA

Detalles DNA
LABORATORIO DNA, 2001
Roberto Pardo
Consultor
Regional Director, Microsoft Colombia
OBJETIVOS


Mostrar cómo estructurar aplicaciones
empresariales (DNA 2000) con tecnología
MS
Explicar los conceptos básicos de las
tecnologías claves usadas en desarrollo


COM, MTS/COM+, XML, ADO/OLE-DB,
ASP/IIS, SOAP, etc..
Preparar la teoría para los ejercicios de
los siguientes dos días
AGENDA









Arquitecturas
Objetos
COM
MTS/COM+
XML
ADO
SOAP
Presentación
Seguridad
AGENDA








Arquitecturas
Objetos
COM
MTS/COM+
XML
ADO
SOAP
Seguridad
Puntos a tratar





Visión Global de la Estructura Interna
Programación
Transacciones
Concurrencia
Lo nuevo y específico de COM+
Qué es MTS?


Microsoft® Transaction Server (MTS) es una adición
a COM!
Es un administrador de objetos.




Es un sistema de optimización de manejo de
recursos (object Request Broker)




Propiedades declarativas
Seguridad
Deployment
Pooling de conexiones, threads, etc.
JIT
Concurrencia
Es un manejador de Transacciones (ACID, DTC)
COM+

COM+ reemplaza a COM en Windows 2000:
1: Une MTS y COM en un sólo runtime y modelo de
programación
Olvidarse de “uso o no uso MTS?”
2: Crea nueva infraestructura de información para
tipos (cambia type library, compilador IDL, etc.)

Nuevas Funciones y Mejoras
 Modelo de Concurrencia más poderoso
 Modelo de Seguridad más fino
 Nueva funcionalidad: Queue Components,
Eventos, Component Load Balancing
Arquitectura de MTS (Para
NT)


Un run time para componentes COM (mtxex.dll)
Herramienta de administración (MTS Explorer)


Distributed Transaction Coordinator (DTC)


Corre en Microsoft® Management Console (MMC)
Coordina transacciones sobre recursos
hetereogéneos
…..Todo como parte de IIS, Option Pack 4.0
Arquitectura de MTS COM+
DLLHOST.EXE
COM+ RUNTIME
W2000
Arquitectura de MTS (con
WebServer)
Arquitectura COM+
Arquitectura COM+ (con Web Server)
Objetos “Configurados”


Objetos deben explícitamente
inscribirse en MTS (para NT) o en
COM+ (para W2K)
Se inscriben via herramienta
interactiva (MMC) y un Wizard



NT -> MTS Explorer
W2K -> Component Services
Inscritos


NT -> Objetos MTS
W2K -> Objetos Configurados
Ejemplo de Creación de
Objetos configurados via
Component Services

Usar Component Services
Ejemplo de Creación de
Objetos configurados via
Programación
COMAdminCatalog
COMAdminCatalogCollection
COMAdminCatalogObject
Ejemplo de Creación de
Objetos configurados via
Programación
Dim Catalog
Set Catalog = CreateObject ("COMAdmin.COMAdminCatalog")
Dim collApplications
Set collApplications = Catalog.GetCollection("Applications")
collApplications.Populate
‘ Cree nueva App
Dim objApp
Set objApp = collApplications.Add
‘ Propiedad de la nueva app
objApp.Value("Name") = “Compras”
objApp.Value("QueuingEnabled") = True
objApp.Value("QueueListenerEnabled") = True
objApp.Value("Authentication") = 1
objApp.Value("RunForever") = True
collApplications.SaveChanges
Catalog.InstallComponent "Purchase Order", “C:\Comps\POData.dll” ,"",""
Catalog.InstallComponent "Purchase Order",“C:\Comps\POBusiness.dll” ,"",""
Cambios de MTS a COM+:
Términos






Objeto MTS
Paquete (Package)
Explorador MTS
Mts.exe (surogate)
Catálogo MTS
Registry






Objeto COM+ Configurado
Aplicación COM+
Component Services
dllhost.exe
Catálogo COM+
RegistrationDB (versión
optimizada de Registry)
Catalog Manager en COM+

CM intercepta lectura y escritura de
atributos de componentes configurados.
Intercepta registry también
Creacion de Objeto MTS
remoto

Usa SCM y en el registry del server
encuentra




en [LocalServer32] se pone
\System32\mtx.exe /p:{0EAC413A4696-11D1-B156-0080C72D2182}
El GUID es el del paquete
Explorador de MTS ayuda a crear
setups de servidores y clientes
manteniendo seguridad, puede manejar
varios servidores y correr en clientes
Estructura Interna de MTS

Dos objetos claves

CW: Context Wrapper



Intercepta TODAS las llamadas
“Angel de la Guarda”
OC: Object Context

Objeto COM con Interfases para manejar
propiedades del objeto
CW Context Wrapper
Mtx.exe
Stub
Proxy
CW
C
Objeto
MTS
MTS Executive



Objeto interno creado automáticamente por MTS
cuando se instancia un objeto MTS
Intercepta todas las llamadas
Toda la interacción es a través de este objeto
Puntos interesantes del CW






Hace pre y postprocesamientos antes y
después de invocar métodos del objeto
Mira atributos definidos via Explorador MTS
Entre 600-700 bytes
Mismo CW para varias interfases
Cliente nunca sabe de CW, no distingue
entre objeto COM u objeto MTS
Interesante: puede haber referencia sin
haber objeto!
OC Object Context
Stub
Proxy
Objeto
MTS
CW
C
MTS Executive

OC
Otro objeto interno de MTS asociado con objeto MTS
original que permite comunicarse con MTS para
crear otros componentes, averiguar sobre
seguridad, controlar transaccionalidad
Puntos interesantes del OC





OC no siempre existe durante la vida del
objeto MTS (CW sí)
OC jamás los debe usar el cliente, es de
consumo interno del objeto MTS
Type Library de MTS
En COM+ OC puede ser compartido entre
varios objetos si “sus requerimientos de
runtime son compatibles”
Objetos intrínsecos de ASP (Request,
Response) se tienen como propiedades de
OC
Object Context vs Context
Wrapper

Object Context es interno y
ContextWrapper es la visión externa
Creación de Objetos en MTS
Programación
Un objeto, 3 métodos principalmente
Set ctxObject = GetObjectContext() OJO!
‘NUESTRO CODIGO
No código TX
‘NUESTRO CODIGO
No código thread
No código locking
Set objfoo =
etc.
ctxObject.CreateInstance(“Cuenta.1”)
‘NUESTRO CODIGO
‘NUESTRO CODIGO
Obtiene
contexto
Para crear otro
objeto, hereda mi
contexto
Si todo bien
ctxObject.SetComplete
ctxObject.SetAbort
Si mal
Tres métodos Claves
Sub RunMyTransaction()
' . . . . . . . . . .
' Haga el meollo de la cuestión
' . . . . . . . . . .
'
Exit Sub
End Sub
Tres métodos Claves
Sub RunMyTransaction()
Dim ObjCtx As ObjectContext
Set ObjCtx = GetObjectContext()
' . . . . . . . . . .
' Haga el meollo de la cuestión
' . . . . . . . . . .
' Si todo acaba bien
ObjCtx.SetComplete
Exit Sub
End Sub
Tres métodos Claves
Sub RunMyTransaction()
On Error GoTo WriteError
Dim ObjCtx As ObjectContext
Set ObjCtx = GetObjectContext()
' . . . . . . . . . .
' Haga el meollo de la cuestión
' . . . . . . . . . .
' Si todo acaba bien
ObjCtx.SetComplete
Exit Sub
WriteError:
' Si no se acaba bien
ObjCtx.SetAbort
Err.Raise vbObjectError + 1, ,"Transaction unsuccessful"
End Sub
Tres métodos Claves
Sub RunMyTransaction()
On Error GoTo WriteError
Dim ObjCtx As ObjectContext
Set ObjCtx = GetObjectContext()
' . . . . . . . . . .
' Haga el meollo de la cuestión
Dim Customers As CCusts
Set Customers = ObjCtx.CreateInstance(“Market.CCusts”)
ObjCtx.SetComplete
Exit Sub
WriteError:
' Si no se acaba bien
ObjCtx.SetAbort
Err.Raise vbObjectError + 1, ,"Transaction unsuccessful"
End Sub
Interfases del Object
Context
IUnknown
IObjectContext
ContextInfo
Security
IContextState
Dim
Dim
Dim
Dim
Set
Set
Set
Set
ObjectContext
objCtx As COMSVCSLib.ObjectContext
objInfo As COMSVCSLib.ContextInfo
objSec As COMSVCSLib.SecurityProperty
objSt As COMSVCSLib.IContextState
objCtx = COMSVCSLib.GetObjectContext()
objInfo = objCtx.ContextInfo
objSec = objCtx.Security
objSt = objCtx
Interfase IObjectContext :
Métodos




CreateInstance
DisableCommit
EnableCommit
IsCallerInRole




IsInTransaction
IsSecurityEnabled
SetAbort
SetComplete
Dim objCtx As COMSVCLib.ObjectContext
Set objCtx = GetObjectContext
If objCtx.IsInTransaction Then
‘Do Something
End If
Interfase IObjectContext :
Métodos
Dim ObjCtx As ObjectContext
Set ObjCtx = GetObjectContext()
‘contiene info sobre seguridad
Dim IsAppSecure As Boolean
IsAppSecure = ObjCtx.IsSecurityEnabled()
‘info sobre creador del objeto
Dim Creator As String
Creator = ObjCtx.Security.GetOriginalCreator()
‘info sobre quien invoca al objeto
Dim Caller As String
Caller = ObjCtx.Security.GetOriginalCaller()
Interfases (MTS y COM+)
Interface
Type
Uses
Available in
MTS?
ObjectContext
Object context and call
context
Transaction control; Programmatic security; Obtaining
references to ASP objects such as Request, Response,
and Application
Yes
ContextInfo
Object context
Obtaining contextual information about the current
context, activity, and transaction
No
IContextState
Object context
Transaction control
No
SecurityCallC
ontext
Call context
Programmatic security
No
JIT (Just In Time Activation)
Ciclo de Vida de un Objeto:
Cuatro Etapas

Creación

Activación

Desactivación

Destrucción
JIT y Ciclo de Vida de un
Objeto
Cómo se habilita JIT
Desactivación de Objetos


Via SetComplete() SetAbort() de ObjectContext,
SetDeActivateOnReturn() de IContextState
O también declarativamente
Activación JIT

Al invocarse SetComplete el componente pierde estado
(stateless)

Se comporta como componente recién creado



No hay estado en variables miembro
Esto se llama DESACTIVADO
Los clientes pueden seguir teniendo referencias a él

La siguiente invocación de uno de sus métodos lo
ACTIVA

La propiedad de desactivar y reactivar un objeto MTS
mientras cliente mantiene referencia se llama Just-
In-Time activation
Estado de objeto se pierde al
desactivarse
Private m_CustID As Long
Property Let CustID(ID As Long)
m_CustID = ID
End Property
objVar.CustID = 1234
Function PlaceOrder(Item As String, Qty As Long)
objVar.PlaceOrder(“C 15”, 3)
‘ Haga lo que sea para poner orden
GetObjectContext.SetComplete
End Function
Solución?
objVar.PlaceOrder(“A 12”, 1)
Otra Interfase: ObjectControl
Implements ObjectControl
Private Sub ObjectControl_Activate()
' codigo de iniciación, reemplaza initialize
End Sub
Private Sub ObjectControl_Deactivate()
' codigo de terminar, reemplaza terminate
End
Private Function ObjectControl_CanBePooled() As Boolean
' no en MTS 2.0, si True lo pone en pool en COM+
ObjectControl_CanBePooled = False
End Function
Recuerde!!!!


SetComplete() es un método de la
interfase al objeto ObjectControl
Y hace dos cosas DIFERENTES

Transaccional


Voto
Desactiva el Objeto!!!!!!
Creación de Componentes
MTS desde VB

Creación


Cree ActiveX DLL con propiedad
Instances en Public MultiUse para la(s)
clase(s)
Instalación via MTS Explorer

Drag and drop en Componente de un
Package
Creación objeto (MTS)


Clase AppServer con dos métodos SafeRef y
GetObjectContext
COM+ Services Type Library
Pooling, Transaccionalidad





Pools de Conexiones
Pool de Threads
Pool de Objetos
El debate State vs Stateless
Transacciones
Terminología

Clientes Base: Los que crean
componentes MTS. Primer componente
es el objeto raíz

Pooling: técnica que hace que recursos
se asignen de un pool

De conexiones

De threads

De Objetos
Manejo de Conexiones

Pool de Conexiones

Si mismo string de conexión
Vida Conexión = Vida de la
Instancia
' class CCustomerManager
Private conn As ADODB.Connection
Sub Class_Initialize()
Set conn = New ADODB.Connection
conn.Open sConnect
End Sub
Sub AddCustomer(ByVal Customer As String)
' code to add new customer record using conn
End Sub
Sub Class_Terminate()
conn.Open sConnect
Set conn = Nothing
End Sub
Vida Conexión por Método
Sub MyMethod()
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
conn.Open sConnect '(1)establish
connection
'*** your code here (2) conduct rw
ops
conn.Close
' (3) close
connection
Set conn = Nothing
End Sub
Transacciones
Reglas ACID


Transacción debe cumplir 4 requerimientos
Debe ser atómica


Deber ser consistente


Nunca debe quedar en estado inválido una vez que
termine la transacción
Debe ser isolated (aislada)


Todo o nada
Cambios uncommitted no los puede ver nadie
Debe se durable

Commited implica persistente
Operaciones (implícitas a
veces) en Transacciones
Sub HagaAlgo()
.....
Begintransaction()
.....
Lock Tabla Clientes
Update Tabla Clientes
....
Lock Registro Proveedores
Update Registro Proveedores
.....
If todobien then
CommitTransaction
Else
AbortTransaction
End Sub
Transacciones

Granularidad


Normalmente implícito
Se puede controlar via hints
UPDATE Products WITH (ROWLOCK)
SET Quantity = Quantity - 1
WHERE Name = 'Dog'
Problemas potenciales de
Concurrencia

Lost Updates
Dirty Reads
Unrepeatable Reads
Phantoms

EJERCICIO EN QUERY ANALYZER



Grados de Aislamiento (Isolation),
de Protección entre ellas


Read Uncommitted
Read Committed



Repeatable Read


Reads se liberan antes de acabar trans
Default en SQLServer y ADO cuando se
corre tran sin COM+
RC + todos los locks de lectura se mantienen
hasta final de trans
Serializable


RR + si query se invoca varias veces da
siempre el mismo resultado. No phantoms
(v.g., no puede haber insert de otra Tx)
Default en COM+
Grados de Aislamiento

Que ocurran o no estos problemas
depende del grado de aislamiento
Degree
0
1
2
2.999
3
Common Name
Chaos
Read
Uncommitted
Read
Committed
Cursor
Stability
Repeatable
Read
Serializable
AKA
Browse
Isolated
Lost Updates?
Yes
No
No
No
No
Dirty Reads?
Yes
Yes
No
No
No
Unrepeatable Reads?
Yes
Yes
Yes
No
No
Phantoms?
Yes
Yes
Yes
Yes
No
Transaction y Lock Manager
Client 1
VB
Object
ADO
Conn
Lock
Manager
Transaction
Manager
Activity
Client 2
VB
Object
ADO
Conn
Activity
Data
Client N
VB
Object
ADO
Conn
Activity
COM+ Application
Concurrencia implica locking
DBMS
SQLSERVR.EXE
Tx y Aislamiento en ADO
Dim conn As Connection
Set conn = New Connection
conn.Open "DSN=Market;UID=sa;PWD="
conn.IsolationLevel = adXactSerializable
conn.BeginTrans
' SQL statements omitted for clarity
conn.Execute SQL_DecrementInventory
conn.Execute SQL_ChargeCustomer
conn.Execute SQL_AddOrder
conn.CommitTrans
Tx en SQL

Control transaccional usando SQL




Lógica SQL metida en batch SQL o en
stored procedure (disminuye tráfico)
Nivel de aislamiento (isolation) se
puede ajustar en cada statement
usando hints.
Normalmente se requiere usar SQL
que es específico de cada DBMS
Con este enfoque, escribir código
OLTP supereficiente que funcione en
varios DBMS es casi imposible
Tx en T-SQL
-- set isolation level to serializable
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
-- run transaction to purchase a product
BEGIN TRANSACTION
-- decrement product quantity from inventory
UPDATE Products
SET Quantity = Quantity - 1
WHERE Product = 'Dog'
-- charge price to customer account
UPDATE Customers
SET AccountBalance = AccountBalance + 20
WHERE Customer = 'Bob'
-- add order record
INSERT Orders(Customer, Product, Quantity, Price)
VALUES('Bob', 'Dog', 1, 20)
COMMIT TRANSACTION
Transacciones Distribuidas

Las transacciones locales sólo
funcionan si datos en la misma
máquina

Qué pasa si los datos están en
diferentes máquinas?


Problema difícil
Commit/Abort toca coordinarlo entre
múltiples fuentes de datos
Una Transacción Distribuida
Computer 2
RM2 -SQL Server
Computer 1
Data
RM1 - MSMQ
Your Tx COM+ Application
RM Proxy
Queue
RM Proxy
Participating DTC
RM Proxy
Computer 3
The Coordinating DTC
RM3 - ORACLE
Data
Participating DTC
Protocolo 2PCP
CTM
PTM 1
PTM 2
PTM n
......
FASE 1
VOTO
VOTO
VOTO
DECISION!
FASE 2
El DTC de Microsoft

DTC es el Distributed Transaction Coordinator





Es el transaction manager de MS
Coordina transacciones distribuidas y garantiza
reglas ACID
Implementa el 2PCP
Originalmente parte de SQLServer, hoy en día
parte de MTS y COM+
MTS/COM+ es como la transacción lógica

DTC crea objeto transaccional y le da interfase
ITransaction a MTS
Esqueleto Típico en código
Sub EjecuteTransaccion()
On Error GoTo ManejeError
Dim ObjCtx As ObjectContext
Set ObjCtx = GetObjectContext()
' ................
' lea y escriba en la base de datos
' si todo sale bien
ObjCtx.SetComplete
Exit Sub
ManejeError:
' Si hubo problema: lógica, bd, etc.
ObjCtx.SetAbort
Err.Raise vbObjectError + 1, ,"Transaccion abortada"
End Sub
Uso del ObjectContext
Si Tx involucra VARIOS
objetos

Objeto base (raíz): donde arranca



Commit o abort son los que realmente resuelven
la transacción
Los Commit y Aborts de los demás objetosson
simplemente votos que se consultan cuando
base resuelva
Transacción “fluye” entre los objetos


Su ID y características abrcan varios objetos
No pasa frontera de aplic COM+
Propiedades Transaccionales
de Objetos
Propiedades transaccionales de
los Objetos




Requires a transaction: Hereda transacción del
creador, COM+ crea una si es necesario (si
creador no tenía transacción)
Requires a new transaction: no hereda
transacción, siempre crea una nueva
Supports transactions: hereda transacción del
creador si éste tiene, o si no ejecuta sin
transacción
Does not support transactions: no hereda,
ejecuta sin transacción
Procesamiento de
Transacciones
Transacciones multicomponentes
Programación Transacciones
Cómo declarar

En ASP:
<%@ TRANSACTION=Required Language=JScript %>

En C++ y Java

Use atributos en type library
#include <mtxattr.h>
[ uuid(04CF0B76-1989-11D0-B917-0080C7394688),
helpstring("Account Class"),
TRANSACTION_SUPPORTED ]
coclass CAccount
{ [default] interface IAccount; };

En Visual Basic

Use MTS/COM+ Explorer, Component Manager
Creación de Objetos Secundarios
Transaction 1
Client
Transaction 2
Root
Joe
Brian
Jason
COM+ Runtime
Activity boundary
Ted
Método del Broker
Function SubmitOrder(ByVal Customer As String, _
ByVal Product As String, _
ByVal Quantity As Long, _
ByRef OrderStatus As String) As Long
On Error GoTo SubmitError
Dim ObjCtx As ObjectContext
Set ObjCtx = GetObjectContext()
Dim Products As CProducts, Price As Currency
Dim Customers As Ccustomers
Dim Orders As COrders, OrderNumber As Long
Set Products = ObjCtx.CreateInstance(“Market.CProducts”)
Set Customers = ObjCtx.CreateInstance(“Market.CCustomers”)
Set Orders = ObjCtx.CreateInstance(“Market.COrders”)
Método del Broker
Price)
Price = Products.Purchase(Product, Quantity)
Customers.Charge Customer, Price
OrderNumber = Orders.Add(Customer, Product, Quantity,
OrderStatus = “The order has been accepted.” & _
“ Your order number is “ & OrderNumber
SubmitOrder = OrderNumber
ObjCtx.SetComplete
SubmitError: ‘if something goes wrong call SetAbort and
get out ASAP
ObjCtx.SetAbort
Err.Raise Err.Number, , Err.Description
End Function
Ejemplo Método
' class CProducts
' Transaction setting: Supports transactions
' ADO code omitted for clarity
Function Purchase(ByVal ProductID As String, _
ByVal Quantity As Long) As Currency
Dim ObjCtx As ObjectContext
Set ObjCtx = GetObjectContext
' ADO code: query to determine quantity in inventory
If(InventoryLevel>=Quantity)
' ADO code: modify inventory level
' ADO code: determine price per unit
Purchase = Quantity * Price
ObjCtx.SetComplete
Else
ObjCtx.SetAbort
Err.Raise vbObjectError + 1, , "Quantity unavailable"
End If
End Sub
Arquitectura Tx Managers
Arquitectura MTS para Transacciones



DTC: Manejador de transacciones
Resource Managers: Manejan “durable state” y 2PCP
(v.g.,SQLServer, MSMQ). Trabaja en llave con DTC
Resource Dispenser: Manejan nondurable shared state (v.g.,
conexiones)
Comportamiento del
Commit/Abort

Cuando se desactiva el objeto raiz…


Runtime de MTS/COM+ llama Commit o Abort
Se manejan 3 flags
COM+ Transaction
Context A
Client
Root
Object
COM+
Proxy
Doomed
Happy
TRUE
Done
FALSE
FALSE
Flags



Happy = Es el voto. Default es True.
Done = Objeto le dice a COM+ si ya
acabó. Si el bit DONE de la raiz (obj.
Base) se pone en True se
desactiva. Default es false.
Doomed: Estado global. COM+ lo
inspecciona al desactivarse objeto
raiz. Si True llama Abort, SI False
hace Commit (Default es False).
Cómo funciona el voto?
Cómo funciona el voto?

Cualquier objeto puede evitar que la transacción
haga commit


Si un objeto secundario se desactiva en estado
unhappy entonces MTS/COM+ coloca el flag de
doomed en true
Es irreversible una vez se coloca en true
COM+ Transaction
Doomed
True/False
proxy
Happy
Client
proxy
Happy
Done
Root
Object
Done
proxy
Happy
Done
proxy
Happy
Done
Secondary
Object 1
Secondary
Object 2
Secondary
Object 3
Cómo se Observa una
Transacción

Lista de Transacciones
Cómo se Observa una
Transacción

Estadísticas
Control de una Transacción

La interfase ObjectContext permite que los
objetos voten explícitamente



Todo objeto que muere “unhappy” hará que la
transacción falle (doom = true)
Todo objeto secundario que no vota está dando
consetimiento (en forma pasiva) para que se haga
commit
El objeto raiz DEBE invocar SetComplete para que
se haga el commit de la transacción
Interfase ObjectContext

Métodos claves




DisableCommit: objeto está diciendo “Estoy
unhappy pero no he acabado – todavía alguien
me puede volver happy."
EnableCommit: objeto está diciendo “Estoy
happy pero no he acabado. Alguien todavía me
puede hacer cambiar de opinión. "
SetComplete: objeto está diciendo " Estoy
happy y he acabado. Me desactivo."
SetAbort: objeto está diciendo " Estoy
unhappy y he acabado. Me desactivo y la
transacción va a fallar (ddom=true) "
Interfase IContextState

Los métodos de ObjectContext manejan los bits de
DONE y HAPPY


COM+ ofrece la interfase IContextState





SetMyTransactionVote
GetMyTransactionVote
SetDeactivateOnReturn
GetDeactivateOnReturn
En qué difiere IContextState de ObjectContext?



SetComplete, SetAbort, DisableCommit, EnableCommit
Puede leer los valores de los bits de done y happy
Los métodos generan errores si el objeto no está en la
transacción
Se debe usar IContextState en vez de ObjectContext?

Realmente no a menos que se quiera leer bits de happy y
done
AutoComplete

Métodos pueden
tener flag marcado
para indicar que
default de Done es
True

Util cuando no se
puede cambiar
código
Consideraciones en transacciones
Multiobjeto

Cada transacción tiene un objeto raíz
la raiz la crea un cliente base

Todos los objetos en una transacción
comparten la misma “actividad”
Elimina problemas de concurrencia y sincronización



En COM+, la raiz crea objetos secundarios
invocando CreateObject
En MTS, la raiz crea objetos secundarios
invocando CreateInstance
Recuerde que el operador New puede causar
problemas en MTS o COM+