1999年,中國北方小城發生了一連串離奇碎屍案,工人在全省各大工廠的煤炭車之中陸續發現了無數被遺棄的斷肢。警方從煤炭車之中發現了梁志軍(王學兵飾)的身份證並因此斷定死者為梁志軍本人。警察張自力(廖凡飾)在火車站和前妻分別時企圖強暴但未遂。之後張自力和其他警察調查碎屍案,他們發現了兩名可疑的貨車司機,並在髮廊將嫌疑犯們拘捕。不過由於張自力沒有為嫌疑犯戴手銬,因而讓疑犯撿槍殺死了兩名警員並且射傷了張自力。張自此之後從警局退役,開始在工廠裏當起了保安,成為一個因失意而酗酒的男人。
五年後,沒有想到再有兩宗以相同犯案手法的案件發生,兩個死者都與一名叫吳志貞(桂綸鎂飾)的洗衣女工有聯繫,而吳志貞是五年前碎屍案的被害人梁志軍的遺孀。不滿足於當保安的張自力從舊同僚刑警小王、現在的王隊長得悉後決定重振雄風,再次出手。張自力決定跟蹤這個女人,而她的生活卻似乎被覆蓋了一層神秘的面紗。張自力試圖揭開案件真相,但卻一步步陷入危險的境地——包括落入這個女人設下的溫柔陷阱。
一次張自力與吳志貞在滑冰的路上被人跟蹤。該跟蹤人在被王隊攔下之後用掛在自己身上的冰鞋殺死了王隊。張自力根據警察留下的汽車牌號追查時發現自己被一位身上掛了冰鞋的男人跟蹤,張後來打算反跟蹤這男人時卻被他逃脫。之後,張發現了這男人的下落並跟蹤他,其後看到了這男人在天橋將屍體拋到運煤的火車上。張發現了這男人原本是還活着的梁志軍的時候,當他想再繼續跟蹤梁志軍卻在溜冰場被梁逃走。
警方傳喚吳志貞,吳供出梁當年搶劫時曾殺人,之後梁利用當時自己是過磅員的身份拋屍,假扮自己被殺,梁之後自己隱姓埋名,還跟蹤吳志貞,殺死了兩個和吳關係密切的人。之後在吳的配合下梁志軍被刑警隊當場擊斃。
然而張自力覺得此事另有蹊蹺。經過調查,發現吳志貞當年剛開始工作時損壞了一件貂皮大衣,被貂皮大衣的主人勒索,之後那人就消失了。張自力找到了大衣的主人的妻子,他們夫妻合開一家叫做「白日焰火」的夜總會。妻子以為丈夫五年前和小三私奔了。吳志貞供出原來貂皮大衣的主人在敲詐吳志貞時還曾強姦她,之後當大衣的主人再度想用大衣一事提出敲詐時,被吳志貞殺死,而梁志軍自願為妻子拋屍,並將自己身份證件放到了死者身上,自己卻成了假死人並在五年中隱姓埋名。
吳志貞被捕後到她當年曾住過的現場去指證證物,但不能完全正確地指證。離開現場時,張自力在樓頂點燃了數發焰火。
電影結局時,張自力走到了交際舞的練習廳裏,獨自一人跳了一段舞蹈。