diff --git a/miner/worker.go b/miner/worker.go
index 64ac21ccd3ac4581a5ae0dc8dc7578b390668755..4a9528c39565c002ee6462c8fa3a1ec79a41ef53 100644
--- a/miner/worker.go
+++ b/miner/worker.go
@@ -453,6 +453,10 @@ func (w *worker) mainLoop() {
 			// already included in the current mining block. These transactions will
 			// be automatically eliminated.
 			if !w.isRunning() && w.current != nil {
+				// If block is already full, abort
+				if gp := w.current.gasPool; gp != nil && gp.Gas() < params.TxGas {
+					continue
+				}
 				w.mu.RLock()
 				coinbase := w.coinbase
 				w.mu.RUnlock()
@@ -463,8 +467,13 @@ func (w *worker) mainLoop() {
 					txs[acc] = append(txs[acc], tx)
 				}
 				txset := types.NewTransactionsByPriceAndNonce(w.current.signer, txs)
+				tcount := w.current.tcount
 				w.commitTransactions(txset, coinbase, nil)
-				w.updateSnapshot()
+				// Only update the snapshot if any new transactons were added
+				// to the pending block
+				if tcount != w.current.tcount {
+					w.updateSnapshot()
+				}
 			} else {
 				// If clique is running in dev mode(period is 0), disable
 				// advance sealing here.