uniCloud.database()下有startTransaction()方法
我看文档没说databaseForJQL有startTransaction方法,难道没有吗?这是为什么?
如果我需要事务处理,难道我需要通过普通的方法自己验证用户的权限吗?我用到事物处理的地方不少,这就有点麻烦了。这样schema的权限校验不就废了吗?武功废了80%啊
Javin
- 发布:2023-07-23 18:10
- 更新:2024-07-17 16:05
- 阅读:336
JQL不支持事务,如果想要使用事务,只能在云函数或云对象中写传统数据库语句(非JQL语句)
请查看数据库事务文档https://doc.dcloud.net.cn/uniCloud/cf-database.html#transaction
注意:
- 云开发的数据库是mogondb,对事务的支持度不是很好,只有部分数据库API支持事务,文档中有写明。
- 一般涉及金额财产等重要操作时,才推荐使用事务
- 不建议滥用事务,事务会锁行,如果所有操作都用事务会导致并发性能非常低甚至数据库报错的情况。
比如转账功能的实现必须依赖事务才能保证数据一致性,而其他的如修改文章信息和添加浏览记录2个更新操作就没必要用事务,即使一个成功一个失败了,影响也不大,即性能和数据一致性需要自己取舍
Javin (作者)
用户参加旅行团需要给用户创建一个订单,着两个是不是就需要事务处理,因为如果发起了团申请没有创建订单就很奇怪了,而这种操作在我这里恰恰非常多。如果不用jql写起来麻烦
2023-07-24 12:17
Javin (作者)
所有和订单相关的可能都需要事务处理,而且要给用户写通知,写通知的可以不放在事务里,但是这样会导致旅行团不知道有人花钱报名了,所以严格的来讲这些操作是不可打断的。而相关的操作数量并不少
2023-07-24 12:22
DCloud_uniCloud_VK
回复 Javin: 理论上创建订单不需要事务,只有订单付款才需要事务处理,因为发起了团申请且没有创建订单是由于数据库导致的概率非常非常低,可以忽略
2023-07-24 14:20
DCloud_uniCloud_VK
事务只用在当有2个或2个以上的更新操作(即update和add)且这2个操作绝不允许1个成功1个失败,此时才用事务。
部分业务是可以容错的,就拿上面的修改文章访问量+添加用户浏览记录 这种业务就算1个成功1个失败,也没事的,如果也用事务,虽然可以保证都成功,但效率变低了,还可能锁行导致其他人报错。
2023-07-24 14:23
DCloud_uniCloud_VK
回复 Javin: 还有就是数据库执行2条更新语句,第一条运行成功了,第二条由于数据库崩溃了导致运行失败的概率非常非常低,一般如果数据库有问题,那么第一条就已经报错了。只是我们为了严谨性,把金额相关的用事务处理。保证100%一致性,而其他的,可以容错就不用事务
2023-07-24 14:31
Javin (作者)
回复 DCloud_uniCloud_VK: 请问mongodb的事务速度很慢吗?他是行级别的乐观锁吗?
2023-07-25 15:09
DCloud_uniCloud_VK
回复 Javin: 大概是不用事务的6成-8成的性能, 用了事务后,不是乐观锁,而是悲观锁,是真的锁住了该行记录
2023-07-25 15:23