1 | #pragma once |
---|---|
2 | |
3 | #include <boost/noncopyable.hpp> |
4 | |
5 | #include <mysqlxx/Connection.h> |
6 | |
7 | |
8 | namespace mysqlxx |
9 | { |
10 | |
11 | /** RAII для транзакции. При инициализации, транзакция стартует. |
12 | * При уничтожении, если не был вызван метод commit(), будет произведёт rollback. |
13 | */ |
14 | class Transaction : private boost::noncopyable |
15 | { |
16 | public: |
17 | Transaction(Connection & conn_) |
18 | : conn(conn_), finished(false) |
19 | { |
20 | conn.query("START TRANSACTION").execute(); |
21 | } |
22 | |
23 | virtual ~Transaction() |
24 | { |
25 | try |
26 | { |
27 | if (!finished) |
28 | rollback(); |
29 | } |
30 | catch (...) |
31 | { |
32 | } |
33 | } |
34 | |
35 | void commit() |
36 | { |
37 | conn.query("COMMIT").execute(); |
38 | finished = true; |
39 | } |
40 | |
41 | void rollback() |
42 | { |
43 | conn.query("ROLLBACK").execute(); |
44 | finished = true; |
45 | } |
46 | |
47 | private: |
48 | Connection & conn; |
49 | bool finished; |
50 | }; |
51 | |
52 | |
53 | } |
54 |