-
Notifications
You must be signed in to change notification settings - Fork 8
/
transactionAspect.js
106 lines (96 loc) · 2.75 KB
/
transactionAspect.js
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
/*!
* .______ _______ ___ .______ ______ ___ .__________.
* ( _ ) ( ____) / \ ( _ ) ( ) / \ ( )
* | |_) ) | |__ / ^ \ | |_) ) | ,----' / ^ \ `---| |---`
* | _ < | __) / /_\ \ | ) | | / /_\ \ | |
* | |_) ) | |____ / _____ \ | |) ----.| `----./ _____ \ | |
* (______) (_______/__/ \__\ ( _| `.____) (______)__/ \__\ |__|
*
* Bearcat-dao TransactionAspect
* Copyright(c) 2014 fantasyni <fantasyni@163.com>
* MIT Licensed
*/
var logger = require('pomelo-logger').getLogger('bearcat-dao', 'TransactionAspect');
/**
* TransactionAspect constructor function.
*
* @api public
*/
var TransactionAspect = function() {
this.dbTransactionManager = null;
}
module.exports = TransactionAspect;
/**
* TransactionAspect set dbTransactionManager.
*
* @param {Object} dbTransactionManager
* @api public
*/
TransactionAspect.prototype.setDbTransactionManager = function(dbTransactionManager) {
this.dbTransactionManager = dbTransactionManager;
}
/**
* TransactionAspect get dbTransactionManager.
*
* @param {Object} dbTransactionManager
* @api public
*/
TransactionAspect.prototype.getDbTransactionManager = function() {
return this.dbTransactionManager;
}
/**
* TransactionAspect do transaction action.
*
* @api public
*/
TransactionAspect.prototype.doInTransaction = function() {
var self = this;
arguments = Array.prototype.slice.apply(arguments);
var target = arguments.shift();
var method = arguments.shift();
var next = arguments.pop();
var args = arguments;
var nargs = [];
logger.info('begain transaction');
this.dbTransactionManager.getTransaction(function(err, transactionStatus) {
if (err) {
logger.error('get transaction error ' + err.message);
return;
}
var n = function(err) {
arguments = Array.prototype.slice.apply(arguments);
nargs = arguments;
if (err) {
logger.error('transaction error ' + err.message);
self.dbTransactionManager.rollback(transactionStatus, function() {
next.apply(null, nargs);
});
return;
}
self.dbTransactionManager.commit(transactionStatus, function(err) {
if (err) {
logger.error('transaction commit error' + err.message);
self.dbTransactionManager.rollback(transactionStatus, function() {
next.apply(null, nargs);
});
return;
}
logger.info('transaction success');
next.apply(null, nargs);
});
}
args.push(n);
args.push(transactionStatus);
try {
target[method].apply(target, args);
} catch (e) {
if (e) {
logger.error('transaction error ' + e.stack);
self.dbTransactionManager.rollback(transactionStatus, function() {
next.apply(null, nargs);
return;
});
}
}
});
}