关于CAP分布式事务的解决方案用SqlSugar作为ORM怎么处理事务? 返回
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();
}
热忱回答(26)
-
fate stay night VIP0
2019/5/7db.Ado.Connection.BeginTransaction
0 回复 -
CAP VIP0
2019/5/8@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 回复 -
fate stay night VIP0
2019/5/8isautoclosecinnection设置false
0 回复 -
fate stay night VIP0
2019/5/8你这个事物我没办法识别 所以关了自动释放
0 回复 -
fate stay night VIP0
2019/5/8不然执行完就close了
0 回复 -
fate stay night VIP0
2019/5/8自己加open
0 回复 -
fate stay night VIP0
2019/5/8自己加open
0 回复 -
fate stay night VIP0
2019/5/80 回复 -
CAP VIP0
2019/5/10@fate stay night:
我是这么理解的、是不是已经开始了事务(using (var transaction = connection.BeginTransaction(_capBus, autoCommit: false))),然后db.Insertable(data).ExecuteCommand();中又在创建新的事务了所以提示:a pengding local transaction
0 回复 -
fate stay night VIP0
2019/5/10默认我是不开open的事物前面要open
0 回复 -
fate stay night VIP0
2019/5/10我自带事务我会开open
0 回复 -
fate stay night VIP0
2019/5/10你这种自己开
0 回复 -
CAP VIP0
2019/5/10@fate stay night:
0 回复 -
CAP VIP0
2019/5/10这样直接写SQL是可以的。
0 回复 -
CAP VIP0
2019/5/10@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 回复 -
fate stay night VIP0
2019/5/10事务不用传的啊 ,connection开了就行了
0 回复 -
fate stay night VIP0
2019/5/10难道你这种事务需要传吗
0 回复 -
fate stay night VIP0
2019/5/10我自带的事务不传没事
0 回复 -
fate stay night VIP0
2019/5/10有方案了
0 回复 -
fate stay night VIP0
2019/5/10db.ado.Transaction=你的事务
0 回复 -
fate stay night VIP0
2019/5/10if (this.Transaction != null)
{
sqlCommand.Transaction = (SqlTransaction)this.Transaction;
}
0 回复 -
fate stay night VIP0
2019/5/10我这边会判段这个事务有没有值有值就传进来
0 回复 -
CAP VIP0
2019/5/13@fate stay night:正解!谢谢老师!
0 回复 -
raolan VIP0
2020/3/1楼主能把你的实现部分发过来看看吗?
0 回复 -
胖??骆驼 VIP0
2020/3/10@raolan: _dbContext.Ado.Transaction = transaction;
1.把自动提交事务关闭
2.把你的事务传入进去后面用ORM事务提交就行了0 回复 -
晚安。 VIP0
2020/6/30给个 Demo
0 回复