我有两张桌子
单位
id - primary key
title - text
flats_reservations
id - primary key
flat_id - foreign key to flats(id)
creator_id - foreign key to users(id)
is_reserved - boolean
created_at - current_timestamp
如果flats_reservations有这些行
id=1, flat_id=12, creator_id=5, is_reserved=1, created_at=2016-10-10 00:00:00
id=2, flat_id=12, creator_id=5, is_reserved=0, created_at=2016-10-10 00:00:05
id=3, flat_id=12, creator_id=4, is_reserved=1, created_at=2016-10-10 00:00:10
然后仅 id = 4的用户可以删除预订(例如插入以下行( is_reserved = 0 )
id=4, flat_id=12, creator_id=4, is_reserved=0, created_at=2016-10-10 00:00:10
没有其他用户可以做到这一点。在任何时间点,只有一个用户可以reserve
持平。
我可以使用mysql事务来确保两个用户同时不能reserve
持平吗?
我想确定,不能立即插入以下行
id=5, flat_id=12, creator_id=4, is_reserved=1, created_at=2016-10-10 00:00:15
id=6, flat_id=12, creator_id=4, is_reserved=1, created_at=2016-10-10 00:00:15
在应用程序中,我在事务中使用以下查询
# transaction start
select is_reserved from flat_reservations where flat_id=12 order by created_at desc limit 1;
# if is_reserved == 0 or query returned 0 rows then
insert into `flat_reservations` (`flat_id`, `creator_id`, `is_reserved`) values (12, 4, 1)
# commit
在执行这两个查询时是否有某种方法可以锁定表格?当flat_id = 12时,是否只有 ?
用户必须能够reserve
其他单位(例如,ID不是12)。
如果不可能,那么我应该锁定整个表格进行写作吗?
答案 0 :(得分:0)
如果您在网站上使用php,您可以在写入之前检查它是否未保留,并将一些文本返回给用户。
您也可以从此表中删除is_reserved并使flat_id为UNIQUE。因此,如果将它添加到此表中,则意味着它被保留。
您也可以尝试仅使用带条件的触发器(如果未保留)来写入此表。