1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
*
* Copyright (C) 2008 Sun Microsystems
* Copyright (c) 2010 Jay Pipes <jaypipes@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* @file Transaction processing code
*/
#ifndef DRIZZLED_TRANSACTION_SERVICES_H
#define DRIZZLED_TRANSACTION_SERVICES_H
namespace drizzled
{
/* some forward declarations needed */
namespace plugin
{
class MonitoredInTransaction;
class XaResourceManager;
class TransactionalStorageEngine;
}
class Session;
class NamedSavepoint;
/**
* This is a class which manages the XA transaction processing
* in the server
*/
class TransactionServices
{
public:
/**
* Constructor
*/
TransactionServices() {}
/**
* Singleton method
* Returns the singleton instance of TransactionServices
*/
static inline TransactionServices &singleton()
{
static TransactionServices transaction_services;
return transaction_services;
}
/* transactions: interface to plugin::StorageEngine functions */
int ha_commit_one_phase(Session *session, bool all);
int ha_rollback_trans(Session *session, bool all);
/* transactions: these functions never call plugin::StorageEngine functions directly */
int ha_commit_trans(Session *session, bool all);
int ha_autocommit_or_rollback(Session *session, int error);
/* savepoints */
int ha_rollback_to_savepoint(Session *session, NamedSavepoint &sv);
int ha_savepoint(Session *session, NamedSavepoint &sv);
int ha_release_savepoint(Session *session, NamedSavepoint &sv);
bool mysql_xa_recover(Session *session);
/**
* Marks a storage engine as participating in a statement
* transaction.
*
* @note
*
* This method is idempotent
*
* @todo
*
* This method should not be called more than once per resource
* per statement, and therefore should not need to be idempotent.
* Put in assert()s to test this.
*
* @param[in] Session pointer
* @param[in] Descriptor for the resource which will be participating
* @param[in] Pointer to the TransactionalStorageEngine resource
*/
void registerResourceForStatement(Session *session,
plugin::MonitoredInTransaction *monitored,
plugin::TransactionalStorageEngine *engine);
/**
* Marks an XA storage engine as participating in a statement
* transaction.
*
* @note
*
* This method is idempotent
*
* @todo
*
* This method should not be called more than once per resource
* per statement, and therefore should not need to be idempotent.
* Put in assert()s to test this.
*
* @param[in] Session pointer
* @param[in] Descriptor for the resource which will be participating
* @param[in] Pointer to the TransactionalStorageEngine resource
* @param[in] Pointer to the XaResourceManager resource manager
*/
void registerResourceForStatement(Session *session,
plugin::MonitoredInTransaction *monitored,
plugin::TransactionalStorageEngine *engine,
plugin::XaResourceManager *resource_manager);
/**
* Registers a resource manager in the "normal" transaction.
*
* @note
*
* This method is idempotent and must be idempotent
* because it can be called both by the above
* TransactionServices::registerResourceForStatement(),
* which occurs at the beginning of each SQL statement,
* and also manually when a BEGIN WORK/START TRANSACTION
* statement is executed. If the latter case (BEGIN WORK)
* is called, then subsequent contained statement transactions
* will call this method as well.
*
* @note
*
* This method checks to see if the supplied resource
* is also registered in the statement transaction, and
* if not, registers the resource in the statement
* transaction. This happens ONLY when the user has
* called BEGIN WORK/START TRANSACTION, which is the only
* time when this method is called except from the
* TransactionServices::registerResourceForStatement method.
*/
void registerResourceForTransaction(Session *session,
plugin::MonitoredInTransaction *monitored,
plugin::TransactionalStorageEngine *engine);
void registerResourceForTransaction(Session *session,
plugin::MonitoredInTransaction *monitored,
plugin::TransactionalStorageEngine *engine,
plugin::XaResourceManager *resource_manager);
};
} /* namespace drizzled */
#endif /* DRIZZLED_TRANSACTION_SERVICES_H */
|