取决于交易的复杂程度,您可能会遇到一些丑陋的嵌套,试图从Node中排列查询,这可能会引入丑陋的变量范围问题。
你可以做的是写一个存储过程,并通过SELECT
结束成功/失败标志,然后用node-mysql查询过程,就像查询SELECT
一样。这里的存储过程可能如下:
DELIMITER //
DROP PROCEDURE IF EXISTS MyProcedure //
CREATE PROCEDURE MyProcedure(IN param1 VARCHAR/*, My, Parameters, ... */)
BEGIN
DECLARE EXIT HANDLER FOR NOT FOUND, SQLWARNING, SQLEXCEPTION
BEGIN
ROLLBACK;
SELECT 0 AS res;
END;
START TRANSACTION;
# My Transaction ...
COMMIT;
SELECT 1 AS res;
END //
DELIMITER ;
您的节点的代码会是这个样子:
var mysql = require('mysql');
var client = mysql.createClient({
host : '127.0.0.1',
user : 'username',
password: 'password'
});
client.query('USE mydatabase');
var myParams = "'param1', 'param2', ... ";
client.query("CALL MyProcedure(" + myParams + ")", function(err, results, fields) {
if (err || results[0].res === 0) {
throw new Error("My Error ... ");
} else {
// My Callback Stuff ...
}
});
如果您有选择,可以使用couch/redis/mongo代替,因为那里更容易使用节点。如果你已经有一个MYSQL数据库继续使用它。 – Raynos 2011-05-09 22:33:06
@Raynos AFAIK MongoDb不支持事务... – renatoargh 2013-06-18 23:01:07