2012-08-03 100 views
1

冗餘行顯示數據庫起來:LockModeType.PESSIMISTIC_WRITE得出:當前沒有事務處於活躍

mysql> 
mysql> 
mysql> USE usenet;SHOW TABLES;DESCRIBE ARTICLE;DESCRIBE NEWSGROUP;SELECT * FROM NEWSGROUP; 
Database changed 
+------------------+ 
| Tables_in_usenet | 
+------------------+ 
| ARTICLE   | 
| NEWSGROUP  | 
+------------------+ 
2 rows in set (0.00 sec) 

+---------------+------------+------+-----+---------+----------------+ 
| Field   | Type  | Null | Key | Default | Extra   | 
+---------------+------------+------+-----+---------+----------------+ 
| ID   | bigint(20) | NO | PRI | NULL | auto_increment | 
| MESSAGENUMBER | int(11) | YES |  | NULL |    | 
| NEWSGROUP_ID | bigint(20) | YES | MUL | NULL |    | 
+---------------+------------+------+-----+---------+----------------+ 
3 rows in set (0.00 sec) 

+-----------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-----------+--------------+------+-----+---------+----------------+ 
| ID  | bigint(20) | NO | PRI | NULL | auto_increment | 
| NEWSGROUP | varchar(255) | YES |  | NULL |    | 
+-----------+--------------+------+-----+---------+----------------+ 
2 rows in set (0.00 sec) 

+----+-------------------------------+ 
| ID | NEWSGROUP      | 
+----+-------------------------------+ 
| 1 | gwene.com.androidcentral  | 
| 2 | gwene.com.androidcentral  | 
| 3 | gwene.com.blogspot.emacsworld | 
| 4 | gwene.com.blogspot.googlecode | 
| 5 | gwene.com.blogspot.googlecode | 
| 6 | gwene.com.economist   | 
| 7 | gwene.com.economist   | 
+----+-------------------------------+ 
7 rows in set (0.00 sec) 

mysql> 

NEWSGROUP.newsgroup應該有獨特的價值。我有理由相信,我需要在Article構造鎖定數據庫:

public Article(Message message, Folder folder) { 
    messageNumber = message.getMessageNumber(); 
    EntityManagerFactory emf; 
    EntityManager em; 
    emf = Persistence.createEntityManagerFactory("USENETPU"); 
    em = emf.createEntityManager(); 
    String fullNewsgroupName = folder.getFullName(); 
    TypedQuery<Newsgroup> query = em.createQuery("SELECT n FROM Newsgroup n WHERE n.newsgroup = :newsGroupParam", Newsgroup.class); 
    query.setParameter("newsGroupParam", fullNewsgroupName); 
    em.lock(query, LockModeType.PESSIMISTIC_WRITE); 
    try { 
     newsgroup = query.getSingleResult(); 
     LOG.info("found " + query.getSingleResult()); //ok 
    } catch (javax.persistence.NoResultException e) { 
     newsgroup = new Newsgroup(folder); 
     LOG.info(e + "\ncould not find " + fullNewsgroupName); //ok 
    } catch (NonUniqueResultException e) { 
     LOG.info(e + "\nshould never happen\t" + fullNewsgroupName); //not ok 
    } 
} 

然而,該鎖結果:

run: 
DEBUG: nntp: newsrc loading /home/thufir/.newsrc 
DEBUG: nntp: newsrc load: 5 groups in 35ms 
[EL Info]: 2012-08-03 15:35:28.386--ServerSession(17944810)--EclipseLink, version: Eclipse Persistence Services - 2.3.0.v20110604-r9504 
[EL Info]: 2012-08-03 15:35:29.526--ServerSession(17944810)--file:/home/thufir/NetBeansProjects/USENET/build/classes/_USENETPU login successful 
Aug 03, 2012 3:35:30 PM net.bounceme.dur.usenet.driver.FetchBean <init> 
INFO: [gwene.com.androidcentral, gwene.com.blogspot.emacsworld, gwene.com.blogspot.googlecode, gwene.com.blogspot.googlereader, gwene.com.economist] 
Aug 03, 2012 3:35:31 PM net.bounceme.dur.usenet.driver.FetchBean main 
SEVERE: null 
javax.persistence.TransactionRequiredException: 
Exception Description: No transaction is currently active 
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionWrapper.throwCheckTransactionFailedException(EntityTransactionWrapper.java:113) 
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionWrapper.checkForTransaction(EntityTransactionWrapper.java:50) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.checkForTransaction(EntityManagerImpl.java:1776) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.lock(EntityManagerImpl.java:1617) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.lock(EntityManagerImpl.java:1593) 
    at net.bounceme.dur.usenet.model.Article.<init>(Article.java:34) 
    at net.bounceme.dur.usenet.driver.FetchBean.<init>(FetchBean.java:41) 
    at net.bounceme.dur.usenet.driver.FetchBean.main(FetchBean.java:21) 

BUILD SUCCESSFUL (total time: 16 seconds) 

而註釋掉它給人的正常運行:

run: 
DEBUG: nntp: newsrc loading /home/thufir/.newsrc 
DEBUG: nntp: newsrc load: 5 groups in 14ms 
[EL Info]: 2012-08-03 15:36:28.103--ServerSession(17944810)--EclipseLink, version: Eclipse Persistence Services - 2.3.0.v20110604-r9504 
[EL Info]: 2012-08-03 15:36:29.186--ServerSession(17944810)--file:/home/thufir/NetBeansProjects/USENET/build/classes/_USENETPU login successful 
Aug 03, 2012 3:36:29 PM net.bounceme.dur.usenet.driver.FetchBean <init> 
INFO: [gwene.com.androidcentral, gwene.com.blogspot.emacsworld, gwene.com.blogspot.googlecode, gwene.com.blogspot.googlereader, gwene.com.economist] 
Aug 03, 2012 3:36:31 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NoResultException: getSingleResult() did not retrieve any entities. 
could not find gwene.com.androidcentral 
Aug 03, 2012 3:36:31 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: found gwene.com.androidcentral 
Aug 03, 2012 3:36:31 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.androidcentral 
Aug 03, 2012 3:36:31 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.androidcentral 
Aug 03, 2012 3:36:31 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.androidcentral 
Aug 03, 2012 3:36:31 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.androidcentral 
Aug 03, 2012 3:36:31 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.androidcentral 
Aug 03, 2012 3:36:31 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.androidcentral 
Aug 03, 2012 3:36:31 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NoResultException: getSingleResult() did not retrieve any entities. 
could not find gwene.com.blogspot.emacsworld 
Aug 03, 2012 3:36:31 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NoResultException: getSingleResult() did not retrieve any entities. 
could not find gwene.com.blogspot.googlecode 
Aug 03, 2012 3:36:32 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: found gwene.com.blogspot.googlecode 
Aug 03, 2012 3:36:32 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.blogspot.googlecode 
Aug 03, 2012 3:36:32 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.blogspot.googlecode 
Aug 03, 2012 3:36:32 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.blogspot.googlecode 
Aug 03, 2012 3:36:32 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.blogspot.googlecode 
Aug 03, 2012 3:36:32 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.blogspot.googlecode 
Aug 03, 2012 3:36:32 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.blogspot.googlecode 
Aug 03, 2012 3:36:32 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NoResultException: getSingleResult() did not retrieve any entities. 
could not find gwene.com.economist 
Aug 03, 2012 3:36:33 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: found gwene.com.economist 
Aug 03, 2012 3:36:33 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.economist 
Aug 03, 2012 3:36:33 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.economist 
Aug 03, 2012 3:36:33 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.economist 
Aug 03, 2012 3:36:33 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.economist 
Aug 03, 2012 3:36:33 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.economist 
Aug 03, 2012 3:36:33 PM net.bounceme.dur.usenet.model.Article <init> 
INFO: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
should never happen gwene.com.economist 
Aug 03, 2012 3:36:33 PM net.bounceme.dur.usenet.driver.FetchBean <init> 
INFO: **************************done 
BUILD SUCCESSFUL (total time: 16 seconds) 

只有Article構造函數曾經實例化一個Newsgroup實體;目前表格生成策略是drop and create

如何在此場景中獲取鎖以防止重複?

回答

0

您需要在執行鎖定查詢之前啓動事務。您只能在數據庫事務的上下文中鎖定某些內容。

相關問題