-(defmethod database-abort-transaction (database)
- (with-accessors ((level transaction-level))
- database
- (if (< 0 level)
- (progn
- (setf level 0)
- (execute-command "ROLLBACK" :database database))
- (warn "Continue without abort."
- 'clsql-simple-error
- :format-control "Cannot abort transaction against ~A because there is no transaction in progress."
- :format-arguments (list database)))))
-
-(defvar *transaction-level* 0)
-(defvar *transaction-id* nil)
+(defmethod database-end-transaction (database commit)
+ (when (not commit)
+ (setf (aborted (transaction database)) t))
+ (if (> (transaction-level database) 0)
+ (when (zerop (decf (transaction-level database)))
+ (let ((transaction (transaction database)))
+ (if (aborted transaction)
+ (unwind-protect
+ (execute-command "ROLLBACK" :database database)
+ (map nil #'funcall (rollback-hooks database)))
+ (progn
+ (execute-command "COMMIT" :database database)
+ (map nil #'funcall (commit-hooks transaction))))))
+ (warn "Continue without commit."
+ 'clsql-simple-error
+ :format-control "Cannot commit transaction against ~A because there is no transaction in progress."
+ :format-arguments (list database))))