BOS运行时 - 执行计划 - 如何在执行计划使用事务原创
62人赞赏了该文章
620次浏览
编辑于2023年09月22日 17:26:36
星空的执行计划默认是没有使用事务的,如果想要实现多条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语句执行后强制抛出异常,这样由于事务一致性,两条数据都不写入。如下图
仅插入一条事务失败的记录
赞 62
62人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读
您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!
请选择打赏金币数 *
10金币20金币30金币40金币50金币60金币
可用金币: 0