BOS运行时 - 执行计划 - 如何在执行计划使用事务

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

BOS运行时 - 执行计划 - 如何在执行计划使用事务

星空的执行计划默认是没有使用事务的,如果想要实现多条SQL同时执行,需要显式声明事务代码,这样对应的SQL可以保证事务一致性。


星空事务声明代码块如下:

using (KDTransactionScope trans = new KDTransactionScope(System.Transactions.TransactionScopeOption.Required))
{
     //多条SQL语句执行
      trans.Complete();
}


以下案例演示,存在2个insert语句,要么同时插入数据,要不都不插入数据库


新创建一个测试表

create table t_tran_test
(fid varchar(40),fdesc nvarchar(100));


新建一个执行计划,增加执行计划代码,显式声明事务

using Kingdee.BOS;
using Kingdee.BOS.App.Core.Warn.Data;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Contracts;
using NPOI.OpenXmlFormats.Spreadsheet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cloud.BOS.Support.SchedulePlugin
{
    public class TransSchedulePlugin : IScheduleService
    {
        public void Run(Context ctx, Kingdee.BOS.Core.Schedule schedule)
        {
            TransactionTest(ctx);
        }

        private void TransactionTest(Context ctx)
        {
            try
            {
                using (KDTransactionScope trans = new KDTransactionScope(System.Transactions.TransactionScopeOption.Required))
                {
                    //测试事务内同时提交数据
                    string insertSql = "insert into t_tran_test(fid,fdesc) values(@fid,@fdesc)";
                    List<SqlParam> insertParams = new List<SqlParam>();
                    insertParams.Add(new SqlParam("@fid", KDDbType.AnsiString, Guid.NewGuid().ToString()));
                    insertParams.Add(new SqlParam("@fdesc", KDDbType.String, DateTime.Now.ToLongTimeString()));
                    DBUtils.Execute(ctx, insertSql, insertParams);

                    //执行后成第一次后,抛出异常测试
                    if (DateTime.Now.Minute % 2 == 0)
                    {
                        throw new Exception("test expception");
                    }

                    string insertSql2 = "insert into t_tran_test(fid,fdesc) values(@fid,@fdesc)";
                    List<SqlParam> insertParams2 = new List<SqlParam>();
                    insertParams2.Add(new SqlParam("@fid", KDDbType.AnsiString, Guid.NewGuid().ToString()));
                    insertParams2.Add(new SqlParam("@fdesc", KDDbType.String, DateTime.Now.ToLongTimeString()));
                    DBUtils.Execute(ctx, insertSql2, insertParams2);

                    trans.Complete();

                }
            }
            catch
            {
                string rollbackSql = "insert into t_tran_test(fid,fdesc) values(@fid,@fdesc)";
                List<SqlParam> paras = new List<SqlParam>();
                paras.Add(new SqlParam("@fid", KDDbType.AnsiString, Guid.NewGuid().ToString()));
                paras.Add(new SqlParam("@fdesc", KDDbType.String, DateTime.Now.ToLongTimeString() + " Rollback"));
                DBUtils.Execute(ctx, rollbackSql, paras);
            }
        }
    }
}


这个执行计划中,当分钟为奇数时,同时写入2条数据,如下图

image.webp


当执行时间为偶数时,代码在第一个insert语句执行后强制抛出异常,这样由于事务一致性,两条数据都不写入。如下图

仅插入一条事务失败的记录

image.webp

BOS运行时 - 执行计划 - 如何在执行计划使用事务

星空的执行计划默认是没有使用事务的,如果想要实现多条SQL同时执行,需要显式声明事务代码,这样对应的SQL可以保证事务一致性。星空事务声...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息