你可能以为这是一遍很扯淡的文章,可是做者会用下面的内容告诉你..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)虽然看起来很酷,可是殊不知道其真正的风险
知其然不知其因此然,存在风险
响应前言,做者会用上面的内容告诉你,内容很扯淡