数据库加锁的问题或者是事务的问题小白求助

大板牙花生 2021-04-19 08:31:45
是这样的。从数据库MYSQL.innodb中读取一条数据,然后进行相应操作A,回写这条数据到数据库,因为操作A涉及时间较长,并且会需要其他数据库操作支持,这样数据库加锁容易造成冲突,请问该如何进行设计呢?
...全文
143 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
chengangcsdn 2021-04-20
  • 打赏
  • 举报
回复
引用 楼主 大板牙花生 的回复:
是这样的。从数据库MYSQL.innodb中读取一条数据,然后进行相应操作A,回写这条数据到数据库,因为操作A涉及时间较长,并且会需要其他数据库操作支持,这样数据库加锁容易造成冲突,请问该如何进行设计呢?
如果并发要求高,就采用楼上解法。尽量缩短事务长度。 还有一种解法,select * from t where field = 1 lock in share mode; 加共享锁 这样,你这个长事务会造成别的事务等待,不会造成死锁。
trainee 2021-04-19
  • 打赏
  • 举报
回复
设计程序时,一个事务从加锁到提交,尽可能短的时间,中间不能有交互性操作,否则容易造成冲突。 所以设计程序时,尽量用乐观锁(百度一下)。大概是:第一次读取数据时不加锁,交互性操作后,提交数据时再加锁,然后比较数据库当前值和第一次获取的旧值是否一致,若一致,说明数据在你第一次读取后未修改,否则被人修改,无法提交。 select .* into 旧值 where id=xxx 。。。。交互性操作。。。。 提交时:

start transaction
select  * into 当前值 where id=xxx  for update
if 旧值<>当前值 then
   -- 此记录在你修改的时候,它人已经修改
   rollback
end if
update .... set xxx=新值  where id=xxx 
commit
需要比较的字段看你业务需求,一般是重要字段,有的数据库有版本号概念(如postgresql),可以用版本号来比较。

56,675

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧