配置:
upstream database {
postgres_server 127.0.0.1:5432 dbname=dbname
user=user password=pwd;
postgres_keepalive max=100 ;
}
location /postgres {
default_type text/html;
set_by_lua $query_sql 'return ngx.unescape_uri(ngx.var.arg_sql)';
postgres_pass database;
rds_json on;
postgres_query $query_sql;
}
lua访问数据库代码:
function query_pg_db(s_sql)
local res = ngx.location.capture('/postgres',
{ args = {sql = s_sql } }
)
return res.status, res.body
end
业务逻辑:
query_from_db("begin")
query_from_db("update ...")
。。。 。。。
query_from_db("insert ...")
query_from_db("commit")
业务需要,lua中启用postgresql的事务,发现了两个问题:
* 如果所有的sql语句分开写,这4个语句的执行就是相互独立的,无法准确要求他们都发生在同一个数据库连接上,所以begin、commit就失去了意义,甚至造成错误。
* 如果所有的sql统一成单个sql执行,结果直接返回500错误(postgres_query $query_sql 是单行sql的执行)。