保护表不被插入错误的数据

时间:2016-10-22 21:57:43

标签: mysql sql transactions locking

我有两张桌子

单位

   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)。

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

1 个答案:

答案 0 :(得分:0)

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

您也可以从此表中删除is_reserved并使flat_id为UNIQUE。因此,如果将它添加到此表中,则意味着它被保留。

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