我正在处理一个表,其中有一个int列,当某个事件发生时,该列将被扣除。该值是预先确定的,不能低于零。将有大量并发sql事务从数据库中声明值。它只是一个柜台,就像音乐会门票是怎么预订的。目前,我的逻辑不能保证它以有效的方式保持在0以上(更新前选择不能保证:())。有什么诀窍来执行这个商业规则吗?如果值不足,则事务不应通过。
dw1jzc5e1#
您可以探索mysql的check约束。它将确保列值永远不会低于零,也不需要使用sql代码验证计数器。示例表定义:-
CREATE TABLE IF NOT EXISTS events ( event_count DECIMAL(10 , 2 ) NOT NULL CHECK(cost >= 0), price DECIMAL (10,2) NOT NULL );
b0zn9rqh2#
解决方案1-使用无符号
ALTER TABLE events MODIFY event_count INT UNSIGNED NOT NULL
试图降低到0以下将导致错误。解决方案2-使用查询
UPDATE events SET event_count=event_count-1 WHERE event_id={X} AND event_count > 0
查看受影响的行,看看是否发生了这种情况。
z0qdvdin3#
好像你需要某种锁紧装置。该功能在mysql中可用:innodb表实现行级锁定-请参阅此文档isam只提供表级锁定
3条答案
按热度按时间dw1jzc5e1#
您可以探索mysql的check约束。它将确保列值永远不会低于零,也不需要使用sql代码验证计数器。
示例表定义:-
b0zn9rqh2#
解决方案1-使用无符号
试图降低到0以下将导致错误。
解决方案2-使用查询
查看受影响的行,看看是否发生了这种情况。
z0qdvdin3#
好像你需要某种锁紧装置。
该功能在mysql中可用:
innodb表实现行级锁定-请参阅此文档
isam只提供表级锁定