java spring中的并发:@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.SERIALIZABLE)无效

时间:2018-01-22 05:20:44

标签: java mysql spring transactions

我正在开发一个java(spring / hibernate)应用程序,它是一种定时和数量有限的销售平台。我不得不在上午10点到11点的时间段内只售出1000张类型的卡片。我在大约3秒钟内得到大约150,000个请求,最终卖出了1000多张卡,有时是1150张,有时是1300张。这反过来导致销售的商品超过了指定的限制。

我认为我的程序无法处理并发,即使我在我的函数上指定了函数的事务约束。如何限制并确保每个请求从MySQL表中读取最新状态,并且不会违反数量限制。

代码结构:

@Transactional (propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE) FUNCTION() {  
    1.//check limit from DB();  
    2. //if limit is not breached, insert new item into the transaction table;  
    3. //Update user profile;   
}

1 个答案:

答案 0 :(得分:0)

有很多方法可以实现这一目标,但这完全取决于数据库检查和更新需要多长时间以及运行应用程序的JVM数量。 如果它只是一个JVM并且您的事务足够快,那么您始终可以同步顶级调用。其他方法是使用原子锁。

如果涉及多个JVM,您可以使用更高级的锁定机制,例如Hazelcast IMDG提供的锁定机制。

我不确定MySql,但在Oracle中,您也可以轻松锁定数据库级别的进程。你可以看到很多选择: - )