如题,假如一个插件运行于多个服务端且通过同一个数据库表共享数据
且每个端随时都可能对同一行数据进行读写
这种场景可以认为是多线程并发读写了,请问如何才能保证数据安全性的问题呢?
是否有现有的库能够借用,而不必重复造轮子?
使用java的synchronized关键字能否保证多个进程之间的安全性(估计是不行)?
感谢各位大佬指点赐教!
且每个端随时都可能对同一行数据进行读写
这种场景可以认为是多线程并发读写了,请问如何才能保证数据安全性的问题呢?
是否有现有的库能够借用,而不必重复造轮子?
使用java的synchronized关键字能否保证多个进程之间的安全性(估计是不行)?
感谢各位大佬指点赐教!
*并不是专业人士 如有不当之处望海涵
对于操作数据库,处理并发就不应该是在操作数据库的程序解决, 而是由数据库本身来处理
例如使用 事务来保证 https://www.runoob.com/mysql/mysql-transaction.html 操作原子性等
对于使用 synchronized...你能保证你的每一个操作都安全,但没法保证别人的操作,毕竟数据库是共用的,反而会拖慢响应
对于操作数据库,处理并发就不应该是在操作数据库的程序解决, 而是由数据库本身来处理
例如使用 事务来保证 https://www.runoob.com/mysql/mysql-transaction.html 操作原子性等
对于使用 synchronized...你能保证你的每一个操作都安全,但没法保证别人的操作,毕竟数据库是共用的,反而会拖慢响应
开启一个事务然后再 select for update
美味的曲奇 发表于 2022-4-18 18:34
*并不是专业人士 如有不当之处望海涵
对于操作数据库,处理并发就不应该是在操作数据库的 ...
感谢解答
目前考虑做一个跨服全球市场插件,在点击购买物品时,可能该物品已被其他玩家买走,若直接给予玩家物品等于同一个商品卖出了2次,因此在处理前需要再次查询数据库以确认是否仍然存在
总体来说逻辑有点复杂,也可能有情况没考虑到,等有时间研究一下事务这个东西
金瓯 发表于 2022-4-18 18:39
请问这个事务指的是MYSQL的功能,还是要开发者自己来实现
事务是数据库支持的,开发者只需要调用
金瓯 发表于 2022-4-18 18:39
请问这个事务指的是MYSQL的功能,还是要开发者自己来实现
你可以把 “select for update” 放到搜索引擎里搜索一下,这种其实是比较基础的知识了。
至于事务的话,当然是 MySQL 的事务。不用事务的话,其实还可以弄分布式锁,不过没必要。
金瓯 发表于 2022-4-18 18:36
感谢解答
目前考虑做一个跨服全球市场插件,在点击购买物品时,可能该物品已被其他玩家买走,若直接给予 ...
那么事务的确是合适的解决方案
事务最常用的就是在订单购物这类情况
可以在一条语句执行失败(比如扣款失败)时回滚事务
在执行一个事务时保证独立(防止超售)