我有一个API,需要执行以下操作:
接受并发请求并以它们到达时的顺序执行它们,确保一次只执行/提交一个请求。
请求应单独执行,因此当第一个请求提交到数据库时,第二个请求应等待,并且在第一个请求完成时,第二个请求应使用此更新的数据。
我的代码可以完成上述操作
@Synchronized
@Transactional(
readOnly = false,
isolation = Isolation.READ_COMMITTED,
propagation = Propagation.REQUIRED,
rollbackFor = Exception.class
)
myApi() {
def currentSession = sessionFactory.currentSession
def transaction = currentSession.beginTransaction()
String query = """update table set column = :value"""
Map params = [value: "value"]
currentSession.doWork(new Work() {
public void execute(Connection connection) {
Sql sql = new Sql(connection)
int updateCount = sql.executeUpdate(params, query)
}
})
transaction.commit()
}
有趣的是,我上面的代码做了我想要的事情,它引发了以下错误:
| Error org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
| Error at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:665)
| Error at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757)
| Error at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726)
| Error at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:150)
知道发生了什么事吗?