Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Z
ZEO
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
ZEO
Commits
6596e915
Commit
6596e915
authored
Jun 29, 1999
by
Jim Fulton
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added subtransaction support.
parent
5de492bf
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
70 additions
and
14 deletions
+70
-14
src/ZODB/Transaction.py
src/ZODB/Transaction.py
+70
-14
No files found.
src/ZODB/Transaction.py
View file @
6596e915
...
...
@@ -84,13 +84,13 @@
##############################################################################
"""Transaction management
$Id: Transaction.py,v 1.
7 1999/05/18 15:55:10
jim Exp $"""
__version__
=
'$Revision: 1.
7
$'
[
11
:
-
2
]
$Id: Transaction.py,v 1.
8 1999/06/29 18:28:38
jim Exp $"""
__version__
=
'$Revision: 1.
8
$'
[
11
:
-
2
]
import
time
,
sys
,
struct
from
struct
import
pack
from
string
import
split
,
strip
,
join
from
zLOG
import
LOG
,
ERROR
from
POSException
import
ConflictError
class
Transaction
:
...
...
@@ -99,6 +99,7 @@ class Transaction:
description
=
''
_connections
=
None
_extension
=
None
_sub
=
None
# This is a subtrasaction flag
def
__init__
(
self
,
id
=
None
):
self
.
_id
=
id
...
...
@@ -114,6 +115,7 @@ class Transaction:
del
self
.
_connections
def
sub
(
self
):
# Create a manually managed subtransaction for internal use
r
=
self
.
__class__
()
r
.
user
=
self
.
user
r
.
description
=
self
.
description
...
...
@@ -122,13 +124,23 @@ class Transaction:
def
__str__
(
self
):
return
"%.3f
\
t
%s"
%
(
self
.
_id
,
self
.
user
)
def
abort
(
self
,
freeme
=
1
):
def
abort
(
self
,
sub
=
0
,
freeme
=
1
):
'''Abort the transaction.
This is called from the application. This means that we haven
\
'
t
entered two-phase commit yet, so no tpc_ messages are sent.
'''
t
=
v
=
tb
=
None
subj
=
self
.
_sub
subjars
=
()
if
not
sub
:
if
subj
is
not
None
:
# Abort of top-level transaction after commiting
# subtransactions.
subjars
=
subj
.
values
()
self
.
_sub
=
None
try
:
# Abort the objects
for
o
in
self
.
_objects
:
...
...
@@ -139,41 +151,78 @@ class Transaction:
if
t
is
None
:
t
,
v
,
tb
=
sys
.
exc_info
()
# Ugh, we need to abort work done in sub-transactions.
while
subjars
:
j
=
subjars
.
pop
()
j
.
abort_sub
(
self
)
# This should never fail
if
t
is
not
None
:
raise
t
,
v
,
tb
finally
:
tb
=
None
if
self
.
_id
is
not
None
and
freeme
:
free_transaction
()
if
sub
:
del
self
.
_objects
[:]
# make sure it's empty (shouldn't need)
elif
freeme
:
if
self
.
_id
is
not
None
:
free_transaction
()
else
:
self
.
_init
()
def
begin
(
self
,
info
=
None
):
def
begin
(
self
,
sub
=
None
,
info
=
None
):
'''Begin a new transaction.
This aborts any transaction in progres.
'''
if
self
.
_objects
:
self
.
abort
(
0
)
self
.
_init
()
if
self
.
_objects
:
self
.
abort
(
sub
,
0
)
if
info
:
info
=
split
(
info
,
'
\
t
'
)
self
.
user
=
strip
(
info
[
0
])
self
.
description
=
strip
(
join
(
info
[
1
:],
'
\
t
'
))
def
commit
(
self
):
def
commit
(
self
,
sub
=
None
):
'Finalize the transaction'
t
=
v
=
tb
=
None
jars
=
{}
objects
=
self
.
_objects
jars
=
{}
subj
=
self
.
_sub
subjars
=
()
if
sub
:
if
subj
is
None
:
self
.
_sub
=
subj
=
{}
else
:
if
subj
is
not
None
:
if
objects
:
# Do an implicit sub-transaction commit:
self
.
commit
(
1
)
objects
=
()
subjars
=
subj
.
values
()
self
.
_sub
=
None
t
=
v
=
tb
=
None
try
:
try
:
while
objects
:
o
=
objects
[
-
1
]
j
=
getattr
(
o
,
'_p_jar'
,
o
)
#if j is None:
# print 'waaa'
# print o, o._p_oid
# raise 'what the hell'
i
=
id
(
j
)
if
not
jars
.
has_key
(
i
):
jars
[
i
]
=
j
j
.
tpc_begin
(
self
)
if
sub
:
subj
[
i
]
=
j
j
.
tpc_begin
(
self
,
sub
)
j
.
commit
(
o
,
self
)
del
objects
[
-
1
]
# Commit work done in subtransactions
while
subjars
:
j
=
subjars
.
pop
()
i
=
id
(
j
)
if
not
jars
.
has_key
(
i
):
jars
[
i
]
=
j
j
.
commit_sub
(
self
)
except
:
t
,
v
,
tb
=
sys
.
exc_info
()
...
...
@@ -192,6 +241,11 @@ class Transaction:
try
:
j
.
tpc_abort
(
self
)
# This should never fail
except
:
pass
# Ugh, we need to abort work done in sub-transactions.
while
subjars
:
j
=
subjars
.
pop
()
j
.
abort_sub
(
self
)
# This should never fail
raise
t
,
v
,
tb
for
j
in
jars
.
values
():
...
...
@@ -205,7 +259,9 @@ class Transaction:
finally
:
tb
=
None
if
self
.
_id
is
not
None
:
free_transaction
()
if
sub
:
del
self
.
_objects
[:]
# make sure it's empty (shouldn't need)
elif
self
.
_id
is
not
None
:
free_transaction
()
def
register
(
self
,
object
):
'Register the given object for transaction control.'
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment