我正在开发一个将由多个客户使用的Web服务。我使用EclipseLink作为JPA提供程序。当从客户端调用Web服务中的方法时,我发现EclipseLink使用线程池中的线程来调用该方法,这意味着可以从该线程池中的不同线程同时调用该方法。
在某些方法中,我对数据库中的某些表执行了一些关键写操作,我需要实现某种锁定机制。在写入数据库时同步方法是一种好习惯,还是需要在MySQL中锁定整个表?
一些写入在伪代码中看起来像这样:
1. insert_into_TableA(getLastInsertedIdInTableA + 1);
2. insert_into_TableB(getLastInsertedIdInTableB + 1);
3. int id_A = getLastInsertedIdInTableA + 1;
4. int id_B = getLastInsertedIdInTableB + 1;
5. insert_into_TableAB(id_A, id_B);
下面的数据库结构:
TableA TableAB TableB
pk tableA_id pk tableA_id pk tableB_id
pk tableB_id
我的第二个问题:我没有在我的表中使用autoincrement
,所以在插入新行时获取最后一个插入行的ID然后将其递增1以插入是一个好习惯新排?或者我可以在EclipseLink中使用一些好的方法来为我做这个吗?
答案 0 :(得分:1)
您需要的是“transaction。”
通常,容器将确保在新请求进入时启动新事务,并在处理请求的代码完成后提交事务(除非抛出异常)。
问题是getLastInsertedId
- 这不起作用。不同的交易可能在这里看到相同的价值。解决方案是让数据库为您找出一个新的免费ID。
请改用“标识栏”。在MySQL中,那将是NOT NULL AUTO_INCREMENT。