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

大板牙花生 2021-04-19 08:31:45
是这样的。从数据库MYSQL.innodb中读取一条数据,然后进行相应操作A,回写这条数据到数据库,因为操作A涉及时间较长,并且会需要其他数据库操作支持,这样数据库加锁容易造成冲突,请问该如何进行设计呢?
...全文
62 点赞 收藏 2
写回复
2 条回复
chengangcsdn 04月20日
引用 楼主 大板牙花生 的回复:
是这样的。从数据库MYSQL.innodb中读取一条数据,然后进行相应操作A,回写这条数据到数据库,因为操作A涉及时间较长,并且会需要其他数据库操作支持,这样数据库加锁容易造成冲突,请问该如何进行设计呢?
如果并发要求高,就采用楼上解法。尽量缩短事务长度。 还有一种解法,select * from t where field = 1 lock in share mode; 加共享锁 这样,你这个长事务会造成别的事务等待,不会造成死锁。
回复 点赞
trainee 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),可以用版本号来比较。
回复 点赞
发动态
发帖子
MySQL
创建于2007-09-28

2.4w+

社区成员

5.5w+

社区内容

MySQL相关内容讨论专区
社区公告
暂无公告