我有两张桌子

公寓

   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的单位)。

如果不可能,那么我应该锁定整个表以进行写入吗?

最佳答案

如果您在网站上使用php,则可以在编写之前检查是否未保留php,并将一些文本返回给用户。

您也可以从该表中删除is_reserved,并使flat_id为UNIQUE。因此,如果将其添加到此表中,则表示它已保留。

您也可以尝试仅通过使用带条件的触发器(如果未保留)来写入该表。

关于mysql - 保护表免受错误数据的插入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40197467/

10-16 13:21