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条数据,如下图
当执行时间为偶数时,代码在第一个insert语句执行后强制抛出异常,这样由于事务一致性,两条数据都不写入。如下图
仅插入一条事务失败的记录
BOS运行时 - 执行计划 - 如何在执行计划使用事务
星空的执行计划默认是没有使用事务的,如果想要实现多条SQL同时执行,需要显式声明事务代码,这样对应的SQL可以保证事务一致性。星空事务声...
点击下载文档
上一篇:审批流判断表体单行金额大于1000元下一篇:星空文件服务器配置
本文2024-09-16 18:17:54发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-21237.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章