kratos项目中使用gorm的Transaction的方法介绍

项目地址

项目地址:https://gitee.com/huoyingwhw/kratos-gorm-transaction 

功能介绍

  • 事务开始时使用tx
  • 事务的2种使用方法: 一种是在biz层使用事务然后data层的方法使用DB(ctx)获取tx;另外一种是将事务的操作都放到data层
  • 使用依赖注入初始化Transaction
  • 使用ctx传递tx
  • 查询单个对象使用Take方法会报ErrRecordNotFound错误,Find方法不会
  • 不能在事务中开启并发去select否则会报 driver: bad connection
  • 可以在事务中开启并发去更新数据
  • 可以并发去执行MySQL的事务,但是实际上会有限制,参考下面并发去执行MySQL事务的问题的说明

并发去执行MySQL事务的问题

在MySQL中,一个事务包含一系列的数据库操作,包括查询操作和修改操作(如插入、更新、删除等)。并发调用同一个事务可能会导致一些问题,具体取决于并发控制机制和事务隔离级别的设置。

在默认的事务隔离级别(可重复读)下,并发调用同一个事务通常不会引起问题。每个事务会创建一个独立的读取视图,该视图包含在事务开始时已经存在的数据。这意味着在事务执行期间,其他并发事务对数据的修改不会影响到该事务的查询操作。因此,并发调用同一个事务不会出现数据不一致的问题。

然而,在其他事务隔离级别(如读未提交、读已提交和可串行化)下,并发调用同一个事务可能会导致一些问题。例如,在读未提交隔离级别下,一个并发事务可能读取到另一个事务尚未提交的数据,导致脏读(Dirty Read)的问题。在可串行化隔离级别下,事务会被串行执行,避免了并发带来的问题,但可能会影响系统的并发性能。

因此,要确保并发调用同一个事务不会出现问题,可以采取以下措施:

设置合适的事务隔离级别,根据应用需求选择合适的隔离级别,以平衡数据一致性和并发性能。

在应用程序中使用适当的并发控制机制,如锁定或乐观并发控制,以避免数据竞争和冲突。

评估事务的执行时间和资源消耗,确保并发调用的事务不会长时间占用数据库连接和资源,导致其他请求的延迟或阻塞。

总之,如果正确地配置了事务隔离级别和并发控制机制,并发调用包含查询操作的事务通常不会引起问题。但仍需根据具体情况进行评估和测试,以确保系统的一致性和性能。

在一个事务中并发执行查询与更新语句的问题

参考: 一个事务中并发执行查询带来的问题

在一个事务中并发执行查询语句会报错

GetOrderMains这个RPC接口使用a.bz.GetOrderMains2方法会报错

在一个接口中并发执行一个有查询的事务不会报错

GetOrderMains这个RPC接口使用a.bz.GetOrderMains1方法不会报错

a.bz.GetOrderMains1这个方法还可以演示配置文件中的max_open_conns,如果配置文件中最大开启的连接数是3,此时并发查5条数据,在事务中sleep 2秒模拟事务延迟,此时运行程序可以发现同一时间只会有3个查询结果,也就是说客户端与MySQL服务器开启的最大连接数是3

在一个事务中执行并发更新不会报错

TransOutOrderBatch这个RPC接口使用a.bz.TransOutOrderBatch方法不会报错

posted on 2023-02-02 19:17  江湖乄夜雨  阅读(377)  评论(0编辑  收藏  举报