一.应用场景
给第三方微信支付平台做接口时,接口访问数据库时间长,微信平台只等30秒,超过时交易失败.而我们的程序是不会超时的,因此造成双方交易状态不一致.
二.解决思路
(1)数据库肯定是存在问题的,因为客观原因暂时不能解决数据库的问题.
(2)只能从接口程序上解决问题.将原来的业务处理放入Task1并执行,主线程计时循环等待.当超过20秒时,创建Task2去等待Task1执行完后,回滚数据库事务,主线程返回失败给微信平台.如果Task1在20秒内执行完成时,跳出循环,提交数据库事务,并返回成功状态给微信平台.
三.测试代码
static string DoSql()
{
var connstr = ConfigurationManager.ConnectionStrings["OracleDbContext"].ToString();
OracleConnection conn = new OracleConnection(connstr);
conn.Open();
OracleTransaction tr = conn.BeginTransaction();
OracleCommand cmd1 = conn.CreateCommand();
bool tf = false;
Stopwatch sw = new Stopwatch();
sw.Start();
Console.WriteLine("-------------Main start ---------------------");
Task t1 = new Task(() => {
Console.WriteLine("-