CAP 2.3版本发布,支持 MongoDB (2)

这里的 connection.StartTransaction 是一个扩展方法,这个扩展方法返回 IClientSessionHandle 接口,它代表的是MongoDB的原生事务对象,我们在做自己业务代码的时候拿到这个对象即可使用。

命名 StartTransaction 的原因是我们希望遵循MongoDB的命名规范,便于使用者理解

SQLServer:

using (var connection = new SqlConnection("")) { using (var transaction = connection.BeginTransaction(_capBus, autoCommit: false)) { //your business code sample connection.Execute("insert into test(name) values('test')", transaction); _capBus.Publish("sample.rabbitmq.sqlserver", DateTime.Now); transaction.Commit(); } }

这里的 connection.BeginTransaction 是一个扩展方法,这个扩展方法返回 IDbTransaction 接口,它代表的是数据库的原生事务对象,我们在做自己业务代码的时候使用这个对象传到Dapper或者Ado.net中即可。

MySql 和 PostgreSql:

using (var connection = new MySqlConnection("")) { using (var transaction = connection.BeginTransaction(_capBus, autoCommit: false)) { //your business code sample connection.Execute("insert into test(name) values('test')",transaction: (IDbTransaction)transaction.DbTransaction); _capBus.Publish("sample.rabbitmq.mysql", DateTime.Now); transaction.Commit(); } }

这里的 connection.BeginTransaction 是一个扩展方法,这个扩展方法返回 ICapTransaction 接口,接口包装的有 DbTransaction 属性,它代表的是数据库的原生事务对象,我们在做自己业务代码的时候使用这个对象传到Dapper或者Ado.net中即可。

4、增加了事务自动提交

有些情况下,为了精简代码,我们不想去手动调用 transaction.Commit() 方法希望CAP去帮助你提交事务,那么也是可以做到的,你只需要在 connection.BeginTransaction 的时候传递参数 autoCommit 为 true 即可。

需要注意的是,当使用事务自动提交功能时,你需要在你的业务逻辑执行完成之后再发送消息,也就是说 _capBus.Publish 这行代码需要放到最后执行。实例代码:

using (var connection = new MySqlConnection("")) { using (var transaction = connection.BeginTransaction(_capBus, autoCommit: true)) { //your business code sample _capBus.Publish("sample.rabbitmq.mysql", DateTime.Now); } }

注意这里的 autoCommit: true,并且取消了transaction.Commit()

5、增加对 MongoDB 的支持

微服务应用中,有时候我们的某些服务可能为了性能或者是其他原因考虑,使用的不是传统的关系型数据库,而且一些非关系型数据库,比如这其中MongoDB作为代表,使用的人也最多,然后就有需求希望在存储数据的时候也想保证数据的高一致性。

MongoDB 在 4.0 及以上版本中支持了ACID事务,这个特性使我们有理由对MongoDB提供支持,同时MongoDB的支持也是博客园的Keke同学提供的PR,再次感谢。

有些同学可能想尝试一下,那么下面就来简单的说一下,MongoDB 对 ACID事务的支持是需要集群才能使用,所以我们需要首先搭建一个集群,搭建集群的文章我已经写好了,大家可以参考这篇博客来搭建。

集群搭建完成之后,在 Startup.cs 文件中的 ConfigureServices(IServiceCollection services) 中配置下即可。

public void ConfigureServices(IServiceCollection services) { services.AddSingleton<IMongoClient>(new MongoClient("mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0")); services.AddCap(x => { x.UseMongoDB("mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0"); x.UseRabbitMQ("localhost"); x.UseDashboard(); }); }

使用方法:

注意:MongoDB 不能在事务中创建数据库和集合,所以如果你集群创建好之后是空的,则你需要单独先创建数据库和集合,可以模拟一条记录插入就会自动创建了。

var mycollection = _client.GetDatabase("test").GetCollection<BsonDocument>("test.collection"); mycollection.InsertOne(new BsonDocument { { "test", "test" } });

然后

[Route("~/without/transaction")] public IActionResult WithoutTransaction() { _capBus.Publish("sample.rabbitmq.mongodb", DateTime.Now); return Ok(); } [Route("~/transaction/not/autocommit")] public IActionResult PublishNotAutoCommit() { //NOTE: before your test, your need to create database and collection at first using (var session = _client.StartTransaction(_capBus, autoCommit: true)) { var collection = _client.GetDatabase("test").GetCollection<BsonDocument>("test.collection"); collection.InsertOne(session, new BsonDocument { { "hello", "world" } }); _capBus.Publish("sample.rabbitmq.mongodb", DateTime.Now); } return Ok(); } 总结

最近一两个月明显感觉到使用 CAP 的人越来越多了,博客园也出现了一些CAP的博客文章,我们很开心能够帮助到大家
。大家在使用的过程中遇到问题希望也能够积极的反馈,帮助CAP变得越来越好。:)

如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】。

如果你对 .NET Core 有兴趣的话可以关注我,我会定期的在博客分享我的学习心得。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygxfg.html