Spring事务行为

时间:2016-09-13 19:01:56

标签: spring spring-mvc spring-rest

我是春天的新鸟,所以你的帮助对我有用。

假设我有以下情况:

@Transactional(propagation = Propagation.REQUIRED, timeout = 1, isolation = Isolation.READ_COMMITTED,rollbackFor=Exception.class)
public boolean bookMovieTicket()
{
//Check how many tickets are available
int noTicket=getAvailableTicket();
if(noTicket>0)
{
//decrements the count of ticket
noTicket--;
updateCount(noTicket);
return true;
}
else
{
return false;
}

}

现在假设有两个用户点击了我的应用程序,因此我对请求servlet的理解将创建具有自己的局部变量堆栈的新线程。当线程A命中函数bookTicket()时,它将启动事务,如果有是没有事务存在,现在我的问题是当线程B将调用此方法时,线程B将加入现有事务还是会创建新事务。

这个问题可能很愚蠢,但请清楚这个疑问,对于每个网络请求,交易管理器会创建一个新的交易吗? 并且特定于该请求(该请求的生命周期)应用了交易的传播行为?

我想知道,对于每个web请求是spring transactional manager启动一个新的Transaction线程,我问这是因为在servlet.xml中我们通常默认将事务管理器bean配置为singleton

1 个答案:

答案 0 :(得分:1)

Transactional仅适用于数据库,它不会回滚更改的字段。如果你改变你的类中的字段,你需要处理并发,例如将count变量设为AtomicInteger。