Database Reference
In-Depth Information
dbh
.
commit
dbh
[
'AutoCommit'
]
=
true
rescue
DBI
:
:DatabaseError
=>
e
puts
"Transaction failed, rolling back. Error was:"
puts
"
#{
e
.
err
}
:
#{
e
.
errstr
}
"
begin
# empty exception handler in case rollback fails
dbh
.
rollback
dbh
[
'AutoCommit'
]
=
true
rescue
end
end
Ruby also supports a
transaction
method, which is associated with a code block and
commits or rolls back automatically depending on whether the code block succeeds or
fails:
begin
dbh
[
'AutoCommit'
]
=
false
dbh
.
transaction
do
|
dbh
|
dbh
.
do
(
"UPDATE money SET amt = amt - 6 WHERE name = 'Eve'"
)
dbh
.
do
(
"UPDATE money SET amt = amt + 6 WHERE name = 'Ida'"
)
end
dbh
[
'AutoCommit'
]
=
true
rescue
DBI
:
:DatabaseError
=>
e
puts
"Transaction failed, rolling back. Error was:"
puts
"
#{
e
.
err
}
:
#{
e
.
errstr
}
"
dbh
[
'AutoCommit'
]
=
true
end
With the
transaction
method, there is no need to invoke
commit
or
rollback
explicitly.
transaction
does raise an exception if it rolls back, so the example still uses a
begin/
rescue
block for error detection.
17.6. Using Transactions in PHP Programs
Problem
You want to perform a transaction in a PHP script.
Solution
Use the standard PDO transaction support mechanism.
Discussion
The PDO extension supports a transaction abstraction that can be used to perform
transactions. To begin a transaction, use the
beginTransaction()
method. Then, after
executing your statements, invoke either
commit()
or
rollback()
to commit or roll