关于CAP分布式事务的解决方案用SqlSugar作为ORM怎么处理事务? 返回

求助
23 225
该叫什么 CAP 发布于1周前
悬赏:5 飞吻

CAP地址:

https://github.com/dotnetcore/CAP


EF、Ado.net、Dapper.事务写法如下。不知道SqlSugar要怎么接入。

//Dapper
        [Route("~/dapper/transaction")]
        public IActionResult DapperWithTransaction()
        {

            using (IDbConnection connection = new SqlConnection(AppDbContext.ConnectionString))
            {
                using (var transaction = connection.BeginTransaction(_capBus, autoCommit: false))
                {
                    //your business code
                    connection.Execute("insert into test(name) values('test')", null, transaction);

                    _capBus.Publish("sample.rabbitmq.SqlServer", DateTime.Now);

                    transaction.Commit();
                }
            }

            return Ok();
        }

//Ado.Net 中使用事务,自动提交    [Route("~/adonet/transaction")]
    public IActionResult AdonetWithTransaction()
    {
        using (var connection = new MySqlConnection(ConnectionString))
        {
            using (var transaction = connection.BeginTransaction(_capBus, autoCommit: true))
            {
                //业务代码

                _capBus.Publish("xxx.services.show.time", DateTime.Now);
            }
        }
        return Ok();
    }

    //EntityFramework 中使用事务,自动提交    [Route("~/ef/transaction")]
    public IActionResult EntityFrameworkWithTransaction([FromServices]AppDbContext dbContext)
    {
        using (var trans = dbContext.Database.BeginTransaction(_capBus, autoCommit: true))
        {
            //业务代码

            _capBus.Publish("xxx.services.show.time", DateTime.Now);
        }
        return Ok();
    }


热忱回答23

  •             db.Ado.Connection.BeginTransaction

    0 回复
  • CAP CAP VIP0
    1周前

    @fate stay night:谢谢大神回答。

                using (IDbConnection connection = db.Ado.Connection)

                {

                    using (var transaction = connection.BeginTransaction(_capBus, autoCommit: false))

                    {

                        //your business code

                        var data = new test() { name = "jack" };

                        db.Insertable(data).ExecuteCommand();

                        _capBus.Publish("sample.rabbitmq.SqlServer", DateTime.Now);

                        transaction.Commit();

                    }

                }


    碰到个新的问题在执行到

    db.Insertable(data).ExecuteCommand();

    提示

    An unhandled exception occurred while processing the request.

    InvalidOperationException: ExecuteNonQuery requires the command to have a transaction when the connection assigned to the command is in a pending local transaction. The Transaction property of the command has not been initialized.

    SqlSugar.AdoProvider.ExecuteCommand(string sql, SugarParameter[] parameters)


    0 回复
  • isautoclosecinnection设置false


    0 回复
  • 你这个事物我没办法识别 所以关了自动释放

    0 回复
  • 不然执行完就close了

    0 回复
  • 自己加open

    0 回复
  • 自己加open

    0 回复
  • 0 回复
  • CAP CAP VIP0
    1周前

    @fate stay night

    我是这么理解的、是不是已经开始了事务(using (var transaction = connection.BeginTransaction(_capBus, autoCommit: false))),然后db.Insertable(data).ExecuteCommand();中又在创建新的事务了所以提示:a pengding local transaction

    0 回复
  • 默认我是不开open的事物前面要open

    0 回复
  • 我自带事务我会开open

    0 回复
  • 你这种自己开

    0 回复
  • CAP CAP VIP0
    1周前

    @fate stay night

    image.png

    0 回复
  • CAP CAP VIP0
    1周前



    这样直接写SQL是可以的。


    image.png

    0 回复
  • CAP CAP VIP0
    1周前

    @fate stay night

    刚才下载了SqlSugar源码。看了下在报错。

    应该是上面已经开始了事务了、但是没有把事务传给引起的

    sqlCommand
    SqlCommand cmd = new SqlCommand(sqlText, scon, sqlTrans);
    int count = sqlCommand.ExecuteNonQuery();
    public virtual int ExecuteCommand(string sql, params SugarParameter[] parameters)
            {
                try
                {
                    InitParameters(ref sql, parameters);
                    if (FormatSql != null) 
                        sql = FormatSql(sql);
                    SetConnectionStart(sql);
                    if (this.ProcessingEventStartingSQL != null)
                        ExecuteProcessingSQL(ref sql, parameters);
                    ExecuteBefore(sql, parameters);
                    IDbCommand sqlCommand = GetCommand(sql, parameters);
                    int count = sqlCommand.ExecuteNonQuery();
                    if (this.IsClearParameters)
                        sqlCommand.Parameters.Clear();
                    ExecuteAfter(sql, parameters);
                    return count;
                }
                catch (Exception ex)
                {
                    if (ErrorEvent != null)
                        ExecuteErrorEvent(sql, parameters, ex);
                    throw ex;
                }
                finally
                {
                    if (this.IsAutoClose()) this.Close();
                    SetConnectionEnd(sql);
                }
            }


    0 回复
  • 事务不用传的啊 ,connection开了就行了

    0 回复
  • 难道你这种事务需要传吗

    0 回复
  • 我自带的事务不传没事

    0 回复
  • 有方案了

    0 回复
  • db.ado.Transaction=你的事务

    0 回复
  •      if (this.Transaction != null)

                {

                    sqlCommand.Transaction = (SqlTransaction)this.Transaction;

                }


    0 回复
  • 我这边会判段这个事务有没有值有值就传进来

    0 回复
  • CAP CAP VIP0
    1周前

    @fate stay night:正解!谢谢老师!

    0 回复

版块

学习文档

最新会员

发布达人

回贴达人