7
回答
mysql事务的原子性问题
开发十年,就只剩下这套Java开发体系了   

有一个需求向2张表同时修改相关的数据,2张表同时修改成功才成功。使用的mysql的事务,为什么第一张修改成功,但是第二张表修改失败,也可以通过。事务的原子性不是同时成功同时失败的吗?搞不懂,求大神指点一二,多谢了。

代码如下:

public String transactionOper(){

		boolean  b=false;
		Connection  conn=null;
		PreparedStatement st=null;
		ResultSet rs=null;
		String result="";
		try {
			conn=JdbcUtils.createInstance().getCon();
			boolean autoCommit=conn.getAutoCommit();
			//关闭自动提交功能
			conn.setAutoCommit(false);
			String sql="update t_user set name=? where id=? ";
			st=conn.prepareStatement(sql);
			st.setString(1,"小黑马");
			st.setInt(2, 1);
			st.executeUpdate();
			
			sql="update test set name=? where id=? ";
		    st=conn.prepareStatement(sql);
		    st.setString(1, "12");
		    st.setInt(2, 100);//id=100不存在,但是仍然是执行成功,这是什么原因
		    st.executeUpdate();
			//提交事务
			conn.commit();
			result="成功了。。。";
			//恢复原来的提交模式
		    conn.setAutoCommit(autoCommit);
		} catch (SQLException e) {
			System.out.println("操作失败!!!任务撤销!!!");
			result="失败了。。。";
			try {
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}finally{
			JdbcUtils.release(conn, st, rs);
		}
		return result;
	}


//mysql事务操作3张表
	public boolean addTableField(String[] params) {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Savepoint  sp=null;
		int result=0;
		boolean  b=false;
		try{
			conn = JdbcUtils.createInstance().getCon();
			conn.setAutoCommit(false);
			sp=conn.setSavepoint();
			StringBuffer sql = new StringBuffer("insert into  students(s_name,"
					+ "s_address) values(?,?)"
				);
			
			stmt = conn.prepareStatement(sql.toString());
			stmt.setString(1, params[0]);
			stmt.setString(2,params[1]);
			result = stmt.executeUpdate();
			if(result==0){
				conn.rollback(sp);
				return false;
			}else{
				//给表添加一个字段
				String sql1="alter table test add column "+params[2]+" int(11) ";
			    stmt=conn.prepareStatement(sql1);
			    int i=0;
			    i=stmt.executeUpdate();
			    if(i==0){
			    	conn.rollback(sp);
			    	return false;
			    }else{
			    	String  sql2="insert into t_user(name,pwd) values(?)";//这里少了一个?号,sql2没有执行,但是前面2个都执行了,这个原子性怎么保证啊?
			        stmt=conn.prepareStatement(sql2);
			        stmt.setString(1,params[3] );
			        stmt.setString(2,params[4]);
			        int k=stmt.executeUpdate();
			        if(k>0){
			        	//提交事务
					    conn.commit();
					    b=true;
			        }else{
			        	conn.rollback(sp);
			        	return false;
			        }
			    }
			  
			}
			//设置自动提交为true
			conn.setAutoCommit(true);
			
		}catch(Exception e){
			try {
				conn.rollback(sp);
				conn.releaseSavepoint(sp);
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			return false;
		}finally{
			JdbcUtils.release(conn, stmt, rs);
		}
		return b;
	
	
	}




举报
g084120209
发帖于2年前 7回/415阅
顶部