for循环中控制事务单个提交问题

本文探讨了在for循环中每次迭代都尝试提交事务时遇到的问题。总结了使用通用mapper的updateByPrimaryKeySelective方法时,必须设置主键以避免SQL错误。同时,分析了在Spring声明式事务中,直接方法调用可能不触发代理,导致@Transactional注解失效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近有个业务是for循环里面,循环一次业务提交一次,过程中发现事务不能提交,总结一下这个问题

第一点:

我用的是通用mapper,用到他的updateByPrimaryKeySelective方法,这个方法必须设置主键,不然他的where后面会带上所有字段造成sql错误

第二点:

用spring来做声明式事务的话,方法直接调用内部方法是不会走到代理类的,也就是不会走到切面,所以@Transactional可能会失效

所有我把更新业务单独提出来写在另外一个类里面就搞定了

 

 

MongoDB从4.2版本开始支持存储过程和事务,所以对于早期版本的MongoDB,这个功能是可用的。在MongoDB中创建和执行存储过程,可以使用`create`函数,并且可以在存储过程中使用JavaScript编写逻辑,包括循环。同时,MongoDB的事务是通过`session`和`transaction` API来管理的。 下面是一个基本的示例,展示如何在MongoDB中创建一个存储过程,该过程包含循环,并且演示如何在支持事务的MongoDB环境中添加事务控制。 1. 创建一个包含循环的存储过程,例如,创建一个存储过程,它将重复执行某个操作10次: ```javascript db.createCollection("myCollection"); db.runCommand({ "create": "myCollection", "validator": { $jsonSchema: { bsonType: "object", required: ["someField"], properties: { someField: { bsonType: "string", description: "必须包含一个字符串字段 someField" } } }}, "validationAction": "error", "validationLevel": "strict" }); db.runCommand({ "create": "myProcedure", "principal": { role: "readWrite", db: "yourDatabase" }, "roles": [], "lsid": { "id": UUID("5637d966-1c4a-4277-b0c4-718271e5852d") }, "storageEngine": { "wiredTiger": {} }, "procedure": function() { for (let i = 0; i < 10; i++) { // 在这里执行你需要循环的逻辑 db.myCollection.insertOne({ someField: "example" + i }); } }, "language": "js" }); ``` 2. 要在MongoDB中添加事务支持,需要确保你的MongoDB部署支持多文档事务。下面是一个使用事务的例子: ```javascript const session = db.getMongo().startSession(); session.startTransaction(); try { // 在这里编写你的事务逻辑,例如: for (let i = 0; i < 10; i++) { db.myCollection.insertOne({ someField: "example" + i }, { session }); } // 提交事务 session.commitTransaction(); } catch (error) { // 如果出现错误,则回滚事务 session.abortTransaction(); throw error; } finally { // 关闭session session.endSession(); } ``` 注意,事务只能在副本集和分片集群环境中使用,单个服务器实例是支持事务的。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值