2 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3 "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
4 <!ENTITY % myents SYSTEM "entities.inc">
8 <!-- Transaction handling -->
10 <reference id="ref-transaction">
11 <title>Transaction Handling</title>
14 This section describes the interface provided by &clsql; for
15 handling database transactions. The interface allows for opening
16 transaction blocks, committing or rolling back changes made and
17 controlling autocommit behaviour.
21 <refentry id="start-transaction">
23 <refentrytitle>START-TRANSACTION</refentrytitle>
26 <refname><emphasis>Function</emphasis> <emphasis role="bold">START-TRANSACTION</emphasis></refname>
27 <refpurpose>Open a transaction block.</refpurpose>
28 <refclass>Function</refclass>
33 <function>start-transaction</function> &key <replaceable>database</replaceable> => <returnvalue>&nil;</returnvalue></synopsis>
36 <title>Arguments and Values</title>
39 <term><parameter>database</parameter></term>
42 <glossterm linkend="gloss-database-object">database
43 object</glossterm>. This will default to the value
44 of <symbol>*default-database*</symbol>.</para>
50 <title>Description</title>
51 <para>Starts a transaction block on
52 <parameter>database</parameter> which defaults to
53 <symbol>*default-database*</symbol> and which continues until
54 <function>rollback</function> or <function>commit</function> are
59 <title>Examples</title>
63 (select [*] :from [foo] :field-names nil)
69 (insert-records :into [foo] :av-pairs '(([bar] 1) ([baz] "one")))
71 (select [*] :from [foo] :field-names nil)
77 (select [*] :from [foo] :field-names nil)
82 <title>Side Effects</title>
84 Autocommit mode is disabled and if
85 <parameter>database</parameter> is currently within the scope
86 of a transaction, all commit and rollback hooks are removed
87 and the transaction level associated with
88 <parameter>database</parameter> is modified.
92 <title>Affected by</title>
98 <title>Exceptional Situations</title>
100 Signals an error of type <symbol>sql-database-error</symbol>
101 if <parameter>database</parameter> is not a database object.
105 <title>See Also</title>
107 <member><link linkend="commit"><function>commit</function></link></member>
108 <member><link linkend="rollback"><function>rollback</function></link></member>
109 <member><link linkend="in-transaction-p"><function>in-transaction-p</function></link></member>
110 <member><link linkend="set-autocommit"><function>set-autocommit</function></link></member>
111 <member><link linkend="with-transaction"><function>with-transaction</function></link></member>
117 <function>start-transaction</function> is a &clsql; extension.
122 <refentry id="commit">
124 <refentrytitle>COMMIT</refentrytitle>
127 <refname><emphasis>Function</emphasis> <emphasis role="bold">COMMIT</emphasis></refname>
128 <refpurpose>Commit modifications made in the current transaction.</refpurpose>
129 <refclass>Function</refclass>
132 <title>Syntax</title>
134 <function>commit</function> &key <replaceable>database</replaceable> => <returnvalue>&nil;</returnvalue></synopsis>
137 <title>Arguments and Values</title>
140 <term><parameter>database</parameter></term>
143 <glossterm linkend="gloss-database-object">database
144 object</glossterm>. This will default to the value
145 of <symbol>*default-database*</symbol>.</para>
151 <title>Description</title>
152 <para>If <parameter>database</parameter>, which defaults to
153 <symbol>*default-database*</symbol>, is currently within the
154 scope of a transaction, commits changes made since the
159 <title>Examples</title>
163 (select [*] :from [foo] :field-names nil)
169 (insert-records :into [foo] :av-pairs '(([bar] 1) ([baz] "one")))
171 (select [*] :from [foo] :field-names nil)
177 (select [*] :from [foo] :field-names nil)
182 <title>Side Effects</title>
184 Changes made within the scope of the current transaction are
185 committed in the underlying database and the transaction level
186 of <parameter>database</parameter> is reset.
190 <title>Affected by</title>
192 The transaction level of <parameter>database</parameter> which
193 indicates whether a transaction has been initiated by a call to
194 <function>start-transaction</function> since the last call to
195 <function>rollback</function> or <function>commit</function>.
199 <title>Exceptional Situations</title>
201 Signals an error of type <symbol>sql-database-error</symbol>
202 if <parameter>database</parameter> is not a database object. A
203 warning of type <symbol>sql-warning</symbol> is signalled if there
204 is no transaction in progress.
208 <title>See Also</title>
210 <member><link linkend="start-transaction"><function>start-transaction</function></link></member>
211 <member><link linkend="rollback"><function>rollback</function></link></member>
212 <member><link linkend="in-transaction-p"><function>in-transaction-p</function></link></member>
213 <member><link linkend="add-transaction-commit-hook"><function>add-transaction-commit-hook</function></link></member>
214 <member><link linkend="set-autocommit"><function>set-autocommit</function></link></member>
215 <member><link linkend="with-transaction"><function>with-transaction</function></link></member>
226 <refentry id="rollback">
228 <refentrytitle>ROLLBACK</refentrytitle>
231 <refname><emphasis>Function</emphasis> <emphasis role="bold">ROLLBACK</emphasis></refname>
232 <refpurpose>Roll back modifications made in the current transaction.</refpurpose>
233 <refclass>Function</refclass>
236 <title>Syntax</title>
238 <function>rollback</function> &key <replaceable>database</replaceable> => <returnvalue>&nil;</returnvalue></synopsis>
241 <title>Arguments and Values</title>
244 <term><parameter>database</parameter></term>
247 <glossterm linkend="gloss-database-object">database
248 object</glossterm>. This will default to the value
249 of <symbol>*default-database*</symbol>.</para>
255 <title>Description</title>
256 <para>If <parameter>database</parameter>, which defaults to
257 <symbol>*default-database*</symbol>, is currently within the
258 scope of a transaction, rolls back changes made since the
263 <title>Examples</title>
267 (select [*] :from [foo] :field-names nil)
273 (insert-records :into [foo] :av-pairs '(([bar] 1) ([baz] "one")))
275 (select [*] :from [foo] :field-names nil)
281 (select [*] :from [foo] :field-names nil)
286 <title>Side Effects</title>
288 Changes made within the scope of the current transaction are
289 reverted in the underlying database and the transaction level
290 of <parameter>database</parameter> is reset. </para>
293 <title>Affected by</title>
295 The transaction level of <parameter>database</parameter> which
296 indicates whether a transaction has been initiated by a call to
297 <function>start-transaction</function> since the last call to
298 <function>rollback</function> or <function>commit</function>.
302 <title>Exceptional Situations</title>
304 Signals an error of type <symbol>sql-database-error</symbol>
305 if <parameter>database</parameter> is not a database object. A
306 warning of type <symbol>sql-warning</symbol> is signalled if
307 there is no transaction in progress.
311 <title>See Also</title>
313 <member><link linkend="start-transaction"><function>start-transaction</function></link></member>
314 <member><link linkend="commit"><function>commit</function></link></member>
315 <member><link linkend="in-transaction-p"><function>in-transaction-p</function></link></member>
316 <member><link linkend="add-transaction-rollback-hook"><function>add-transaction-rollback-hook</function></link></member>
317 <member><link linkend="set-autocommit"><function>set-autocommit</function></link></member>
318 <member><link linkend="with-transaction"><function>with-transaction</function></link></member>
329 <refentry id="in-transaction-p">
331 <refentrytitle>IN-TRANSACTION-P</refentrytitle>
334 <refname><emphasis>Function</emphasis> <emphasis role="bold">IN-TRANSACTION-P</emphasis></refname>
335 <refpurpose>A predicate for testing whether a transaction is currently in progress.</refpurpose>
336 <refclass>Function</refclass>
339 <title>Syntax</title>
341 <function>in-transaction-p</function> &key <replaceable>database</replaceable> => <returnvalue>result</returnvalue></synopsis>
344 <title>Arguments and Values</title>
347 <term><parameter>database</parameter></term>
350 <glossterm linkend="gloss-database-object">database
351 object</glossterm>. This will default to the value
352 of <symbol>*default-database*</symbol>.</para>
356 <term><parameter>result</parameter></term>
358 <para>A Boolean.</para>
364 <title>Description</title>
365 <para>A predicate to test whether
366 <parameter>database</parameter>, which defaults to
367 <symbol>*default-database*</symbol>, is currently within the
368 scope of a transaction.
372 <title>Examples</title>
387 <title>Side Effects</title>
393 <title>Affected by</title>
399 <title>Exceptional Situations</title>
405 <title>See Also</title>
407 <member><link linkend="start-transaction"><function>start-transaction</function></link></member>
408 <member><link linkend="commit"><function>commit</function></link></member>
409 <member><link linkend="rollback"><function>rollback</function></link></member>
410 <member><link linkend="set-autocommit"><function>set-autocommit</function></link></member>
416 <function>in-transaction-p</function> is a &clsql; extension.
421 <refentry id="add-transaction-commit-hook">
423 <refentrytitle>ADD-TRANSACTION-COMMIT-HOOK</refentrytitle>
426 <refname><emphasis>Function</emphasis> <emphasis role="bold">ADD-TRANSACTION-COMMIT-HOOK</emphasis></refname>
427 <refpurpose>Specify hooks to be run when committing changes.</refpurpose>
428 <refclass>Function</refclass>
431 <title>Syntax</title>
433 <function>add-transaction-commit-hook</function> <replaceable>commit-hook</replaceable> &key <replaceable>database</replaceable> => <returnvalue>result</returnvalue></synopsis>
436 <title>Arguments and Values</title>
439 <term><parameter>commit-hook</parameter></term>
441 <para>A designator for a function with no required arguments.</para>
445 <term><parameter>database</parameter></term>
448 <glossterm linkend="gloss-database-object">database
449 object</glossterm>. This will default to the value
450 of <symbol>*default-database*</symbol>.</para>
454 <term><parameter>result</parameter></term>
456 <para>The list of currently defined commit hooks for
457 <parameter>database</parameter>.
464 <title>Description</title>
466 Adds <parameter>commit-hook</parameter>, which should a
467 designator for a function with no required arguments, to the
468 list of hooks run when <function>commit</function> is called
469 on <parameter>database</parameter> which defaults to
470 <symbol>*default-database*</symbol>.
474 <title>Examples</title>
478 (add-transaction-commit-hook #'(lambda () (print "Successfully committed.")))
479 => (#<Interpreted Function (LAMBDA # #) {48E2E689}>)
481 "Successfully committed."
486 <title>Side Effects</title>
488 <parameter>commit-hook</parameter> is added to the list of
489 commit hooks for <parameter>database</parameter>.
493 <title>Affected by</title>
499 <title>Exceptional Situations</title>
501 If <parameter>commit-hook</parameter> has one or more required
502 arguments, an error will be signalled when
503 <function>commit</function> is called.
507 <title>See Also</title>
509 <member><link linkend="commit"><function>commit</function></link></member>
510 <member><link linkend="rollback"><function>rollback</function></link></member>
511 <member><link linkend="add-transaction-rollback-hook"><function>add-transaction-rollback-hook</function></link></member>
512 <member><link linkend="with-transaction"><function>with-transaction</function></link></member>
514 </refsect1> <refsect1>
517 <function>add-transaction-commit-hook</function> is a &clsql; extension.
522 <refentry id="add-transaction-rollback-hook">
524 <refentrytitle>ADD-TRANSACTION-ROLLBACK-HOOK</refentrytitle>
527 <refname><emphasis>Function</emphasis> <emphasis role="bold">ADD-TRANSACTION-ROLLBACK-HOOK</emphasis></refname>
528 <refpurpose>Specify hooks to be run when rolling back changes.</refpurpose>
529 <refclass>Function</refclass>
532 <title>Syntax</title>
534 <function>add-transaction-rollback-hook</function> <replaceable>rollback-hook</replaceable> &key <replaceable>database</replaceable> => <returnvalue>result</returnvalue></synopsis>
537 <title>Arguments and Values</title>
540 <term><parameter>rollback-hook</parameter></term>
542 <para>A designator for a function with no required arguments.</para>
546 <term><parameter>database</parameter></term>
549 <glossterm linkend="gloss-database-object">database
550 object</glossterm>. This will default to the value
551 of <symbol>*default-database*</symbol>.</para>
555 <term><parameter>result</parameter></term>
557 <para>The list of currently defined rollback hooks for
558 <parameter>database</parameter>.
565 <title>Description</title>
567 Adds <parameter>rollback-hook</parameter>, which should a
568 designator for a function with no required arguments, to the
569 list of hooks run when <function>rollback</function> is called
570 on <parameter>database</parameter> which defaults to
571 <symbol>*default-database*</symbol>. </para>
574 <title>Examples</title>
578 (add-transaction-rollback-hook #'(lambda () (print "Successfully rolled back.")))
579 => (#<Interpreted Function (LAMBDA # #) {48E37C31}>)
581 "Successfully rolled back."
586 <title>Side Effects</title>
588 <parameter>rollback-hook</parameter> is added to the list of
589 rollback hooks for <parameter>database</parameter>.
593 <title>Affected by</title>
599 <title>Exceptional Situations</title>
601 If <parameter>rollback-hook</parameter> has one or more
602 required arguments, an error will be signalled when
603 <function>rollback</function> is called.
607 <title>See Also</title>
609 <member><link linkend="commit"><function>commit</function></link></member>
610 <member><link linkend="rollback"><function>rollback</function></link></member>
611 <member><link linkend="add-transaction-commit-hook"><function>add-transaction-commit-hook</function></link></member>
617 <function>add-transaction-rollback-hook</function> is a &clsql; extension.
622 <refentry id="set-autocommit">
624 <refentrytitle>SET-AUTOCOMMIT</refentrytitle>
627 <refname><emphasis>Function</emphasis> <emphasis role="bold">SET-AUTOCOMMIT</emphasis></refname>
628 <refpurpose>Turn on or off autocommit for a database.</refpurpose>
629 <refclass>Function</refclass>
632 <title>Syntax</title>
634 <function>set-autocommit</function> <replaceable>value</replaceable> &key <replaceable>database</replaceable> => <returnvalue>result</returnvalue></synopsis>
637 <title>Arguments and Values</title>
640 <term><parameter>value</parameter></term>
642 <para>A Boolean specifying the desired autocommit
643 behaviour for <parameter>database</parameter>.
648 <term><parameter>database</parameter></term>
651 <glossterm linkend="gloss-database-object">database
652 object</glossterm>. This will default to the value
653 of <symbol>*default-database*</symbol>.</para>
657 <term><parameter>result</parameter></term>
659 <para>The previous autocommit value for
660 <parameter>database</parameter>.
667 <title>Description</title>
668 <para>Turns autocommit off for <parameter>database</parameter>
669 if <parameter>value</parameter> is &nil;, and otherwise turns it
670 on. Returns the old value of autocommit flag.
673 For RDBMS (such as Oracle) which don't automatically commit
674 changes, turning autocommit on has the effect of explicitly
675 committing changes made whenever SQL statements are executed.
678 Autocommit is turned on by default.
682 <title>Examples</title>
688 <title>Side Effects</title>
690 <parameter>database</parameter> is associated with the specified
695 <title>Affected by</title>
701 <title>Exceptional Situations</title>
707 <title>See Also</title>
709 <member><link linkend="start-transaction"><function>start-transaction</function></link></member>
710 <member><link linkend="commit"><function>commit</function></link></member>
711 <member><link linkend="add-transaction-commit-hook"><function>add-transaction-commit-hook</function></link></member>
712 <member><link linkend="with-transaction"><function>with-transaction</function></link></member>
718 <function>set-autocommit</function> is a &clsql; extension.
723 <refentry id="with-transaction">
725 <refentrytitle>WITH-TRANSACTION</refentrytitle>
728 <refname><emphasis>Macro</emphasis> <emphasis role="bold">WITH-TRANSACTION</emphasis></refname>
729 <refpurpose>Execute a body of code within a transaction.</refpurpose>
730 <refclass>Macro</refclass>
733 <title>Syntax</title>
735 <function>with-transaction</function> &key <replaceable>database</replaceable> &rest <replaceable>body</replaceable> => <returnvalue>result</returnvalue></synopsis>
738 <title>Arguments and Values</title>
741 <term><parameter>database</parameter></term>
744 <glossterm linkend="gloss-database-object">database
745 object</glossterm>. This will default to the value
746 of <symbol>*default-database*</symbol>.</para>
749 <term><parameter>body</parameter></term>
757 <term><parameter>result</parameter></term>
759 <para>The result of executing <parameter>body</parameter>.</para>
766 <title>Description</title>
767 <para>Starts a transaction in the database specified by
768 <parameter>database</parameter>, which is
769 <symbol>*default-database*</symbol> by default, and executes
770 <parameter>body</parameter> within that transaction. If
771 <parameter>body</parameter> aborts or throws,
772 <parameter>database</parameter> is rolled back and otherwise the
773 transaction is committed.
777 <title>Examples</title>
781 (select [email] :from [employee] :where [= [emplid] 1] :flatp t :field-names nil)
782 => ("lenin@soviet.org")
784 (update-records [employee]
785 :av-pairs '((email "lenin-nospam@soviet.org"))
786 :where [= [emplid] 1]))
788 (select [email] :from [employee] :where [= [emplid] 1] :flatp t :field-names nil)
789 => ("lenin-nospam@soviet.org")
795 <title>Side Effects</title>
797 Changes specified in <parameter>body</parameter> may be made
798 to the underlying database if <parameter>body</parameter>
799 completes successfully.
803 <title>Affected by</title>
809 <title>Exceptional Situations</title>
811 Signals an error of type <symbol>sql-database-error</symbol>
812 if <parameter>database</parameter> is not a database object.
816 <title>See Also</title>
818 <member><link linkend="start-transaction"><function>start-transaction</function></link></member>
819 <member><link linkend="commit"><function>commit</function></link></member>
820 <member><link linkend="rollback"><function>rollback</function></link></member>
821 <member><link linkend="add-transaction-commit-hook"><function>add-transaction-commit-hook</function></link></member>
822 <member><link linkend="add-transaction-rollback-hook"><function>add-transaction-rollback-hook</function></link></member>