你可能以爲這是一遍很扯淡的文章,可是做者會用下面的內容告訴你..java
我院(醫院)已經開通了自助機掛號繳費業務,自助機和我院核心系統通訊方式採用Webservice方式。今天(流水帳日記形式),兩位患者懷揣着輕鬆的心情來看病,他們在自助機作了以下操做(話說圖片會變形)web
一、他們一塊兒來到了自助機前,當時醫院數據庫Sqlserver2008出現卡頓死鎖狀況spring
二、用身份證在自助機辦了一張卡sql
三、他們給本身診療卡充值500元數據庫
四、順帶在自助機上掛了一個號,準備去找醫生看病安全
五、去找醫生期間,醫生因爲沒有找到該患者掛號信息,也未找到該診療卡信息,因而聯繫信息科app
六、信息科工程師查詢,該患者卡號caoliu1024信息不存在,也不存在繳費信息,也不存在掛號信息ide
// resDataStr是返回成功與否的標記 String resDataStr = (String) getJdbcTemplate().execute(sql, new CallableStatementCallback() { public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { //他們比較聰明,想拿一個鏈接,在執行完過程以後,再去查一下,確保數據沒問題 Connection conn = jdbcTemplate.getDataSource().getConnection(); //.. //.. cs.setQueryTimeout(5); rs = cs.executeQuery(); .. if (lstNeedChk.contains(procName)) { //.. //此處爲檢查剛剛寫進去的數據 //若是沒數據就返回失敗 } // .... });
5. 先拋開有沒有開啓事務,我假設他開啓了,可是你寫數據用的cs.executeQuery,校驗數據是從 jdbcTemplate從新getConnection,那麼這兩個Connection有多是同一個鏈接嗎 ?若是是同一個connection,而且事務隔離級別若是是 read committed,那這個check是沒有用的,由於他們可能就是在同一個事務中.check確定能夠查詢到他剛剛本身插入的數據,即便未提交sqlserver
6. 單獨寫了一個junit Test看看connection是否是同一個connection,代碼以下:性能
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath*:spring-application.xml"}) public class JdbcTemplateTest { @Resource private JdbcTemplate jdbcTemplate; @SuppressWarnings({ "rawtypes", "unchecked" }) @Test public void testGetUser() throws Exception { jdbcTemplate.execute("call my_function()",new CallableStatementCallback() { @Override public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { Connection conn = jdbcTemplate.getDataSource().getConnection(); Connection conn2 = jdbcTemplate.getDataSource().getConnection(); System.out.println(conn.getTransactionIsolation()); System.out.println(conn == conn2); System.out.println(conn == cs.getConnection()); return null; } }); } }
7. 檢查存儲過程(sqlserver過程一直沒接觸過,不過仍是拿過來看了一下),隨意挑選了一個好比充 值的過程,代碼以下:
對,這只是一個UC標題通用模板,我借鑑一下!我檢查了一下sqlserver事務隔離級別
dbcc useroptions
查到的是read committed,沒問題!不一樣事務間commit以後,纔會被別的事務看到,這個很正常不過了。
當我在網上漫無目的的查詢sqlserver數據無端丟失數據時,我看到了這麼一句話,這句話也是問題的最關鍵緣由:
nolock means READ UNCOMMITTED
不少特性(如nolock)雖然看起來很酷,可是殊不知道其真正的風險
知其然不知其因此然,存在風險
響應前言,做者會用上面的內容告訴你,內容很扯淡