欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDBC 批处理 无法回滚 struts2jdbcrollback 

程序员文章站 2022-07-13 10:32:24
...
 /**
		 * 预编译+批处理模式更新数据
		 * */
		@SuppressWarnings("deprecation")
		private boolean batchExecuteInsertTest(){
			boolean isok = true;
			Session session = this.getHibernateTemplate().getSessionFactory().openSession();
			Connection conn=null;//连接
			PreparedStatement pstm=null; //预编译语句
			String pstmSql = null;
			Savepoint sp = null;
			try {
				conn = session.connection();
				conn.setAutoCommit(false); // 设置不自动提交  
				sp = conn.setSavepoint();//设置回滚点
				pstmSql =  "insert into  test(id,name) values (?,?)";
				pstm = conn.prepareStatement(pstmSql);
				
				int recordNum = 1; // 计数器  
	            int commit_size = 2;// 每次提交记录数2
	            pstm.setString(1, "5");//			
	            pstm.setString(2, "5——列数据");		
	            pstm.addBatch();

	            int total = 5;
				//循环队列  
				for (int i = 1; i <= total; i++) {
					recordNum++; // 计数 
					pstm.setString(1, i+"");//
					pstm.setString(2, i+"列数据");//
					pstm.addBatch();
					// 每1000次提交一次
					if (recordNum %  commit_size == 0) {// 可以设置不同的大小;如50,100,500,1000等等
						pstm.executeBatch();
						conn.commit();
						pstm.clearBatch();
						conn.setAutoCommit(false);  
						pstm = conn.prepareStatement(pstmSql); 
					}
					
				} 
				if (recordNum % commit_size != 0) { //执行剩余的批处理
					pstm.executeBatch();  
	                conn.commit();  
	            }  
				
			} catch (Exception e) {
				isok = false;
				e.printStackTrace();
				try {  
	                if (conn != null) {  // 回滚事务   
	                	conn.rollback(sp);//回滚到那个事务点上去
	                    conn.commit();
	                }
	             } catch(Exception e2){
	         	 } 
			}finally{
				try {
					if (pstm != null) {
						pstm.close();
						pstm = null;
					}
					if (conn != null) {
						conn.close();
						conn = null;
					}
					if (session != null) {
						session.close();
						session = null;
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			return isok;
		}

 

我设置2条记录进行提交,当执行到第6条语句时,由于主键唯一性,无法执行。却没有事务回滚,不知道怎么回事?希望各位高手指点!