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
方法不会报错