diff --git a/briar-core/src/net/sf/briar/db/Database.java b/briar-core/src/net/sf/briar/db/Database.java
index 0dc1c9d360deb830ad7479b55a554cf9dc4eb7e3..5ed55973f37bc39d872c67a7e11b97a22a010c34 100644
--- a/briar-core/src/net/sf/briar/db/Database.java
+++ b/briar-core/src/net/sf/briar/db/Database.java
@@ -277,7 +277,7 @@ interface Database<T> {
 	/**
 	 * Returns the headers of all messages in the given group.
 	 * <p>
-	 * Locking: message read.
+	 * Locking: message read, rating read.
 	 */
 	Collection<GroupMessageHeader> getMessageHeaders(T txn, GroupId g)
 			throws DbException;
diff --git a/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java b/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java
index 15c30133520209044f7190e7234c43549dd4caff..6fa43393b25f3843d9ac753a774230702f168ca0 100644
--- a/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java
+++ b/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java
@@ -953,22 +953,27 @@ DatabaseCleaner.Callback {
 			throws DbException {
 		messageLock.readLock().lock();
 		try {
-			subscriptionLock.readLock().lock();
+			ratingLock.readLock().lock();
 			try {
-				T txn = db.startTransaction();
+				subscriptionLock.readLock().lock();
 				try {
-					if(!db.containsSubscription(txn, g))
-						throw new NoSuchSubscriptionException();
-					Collection<GroupMessageHeader> headers =
-							db.getMessageHeaders(txn, g);
-					db.commitTransaction(txn);
-					return headers;
-				} catch(DbException e) {
-					db.abortTransaction(txn);
-					throw e;
+					T txn = db.startTransaction();
+					try {
+						if(!db.containsSubscription(txn, g))
+							throw new NoSuchSubscriptionException();
+						Collection<GroupMessageHeader> headers =
+								db.getMessageHeaders(txn, g);
+						db.commitTransaction(txn);
+						return headers;
+					} catch(DbException e) {
+						db.abortTransaction(txn);
+						throw e;
+					}
+				} finally {
+					subscriptionLock.readLock().unlock();
 				}
 			} finally {
-				subscriptionLock.readLock().unlock();
+				ratingLock.readLock().unlock();
 			}
 		} finally {
 			messageLock.readLock().unlock();