Code Bye

jdbc rollback

 

		Connection conn = null;
		Statement smt = null;
		ResultSet result = null;
 		// 注册驱动
		try {
			Class.forName("com.mysql.jdbc.Driver");
 			String url = "jdbc:mysql://localhost:3306/hehe";
			String dbUsername = "root";
			String dbPassword = "12345ad6";

			// -----------------------------------------------------------------------------------------

			System.out.println(" "事务" ");
			conn = DriverManager.getConnection(url, dbUsername, dbPassword);
			conn.setAutoCommit(false);
			smt = conn.createStatement();
 			smt.execute("insert into  dept  values(1,""a"",""s"")");
 			smt.execute("insert into  dept  values(2,""a"",""s"")");
  			smt.execute("insert into  dept  values(""s"",""a"",""s"")");//这个sql会产生异常 第一个值应该是int类型
                        conn.commit();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
                         conn.rollback()
			e.printStackTrace();
		} 

我知道rollback是用来回滚的 一个不成功 所有的都不成功
但是我conn.rollback() 注释掉 前两个依然不会被插入
我觉得前两个应该被插入到数据库中的啊


20分
conn.rollback() 
这句注释掉
那么这句有没有注释掉
 smt.execute(“insert into  dept  values(“”s””,””a””,””s””)”);//这个sql会产生异常 第一个值应该是int类型

如果这句没有注释掉
这个时候抛异常
就走不到
conn.commit();

这样也就不会插入

引用 1 楼 shixitong 的回复:

conn.rollback() 
这句注释掉
那么这句有没有注释掉
 smt.execute(“insert into  dept  values(“”s””,””a””,””s””)”);//这个sql会产生异常 第一个值应该是int类型

如果这句没有注释掉
这个时候抛异常
就走不到
conn.commit();

这样也就不会插入

既然这样 那 何必还要加上 rollback              或者说rollback有其他用处?

我执行一个正确的sql  commit之后 rollback 也会提交
smt.executeUpdate(“update dept  set id=5 where id=1”);
conn.commit();
conn.rollback();
都在一个事物中,事物的原子性要求的,如果想前两条保存成功,要么把前两条放到另一个事物中,要么使用保存点
引用 3 楼 u011853884 的回复:

我执行一个正确的sql  commit之后 rollback 也会提交
smt.executeUpdate(“update dept  set id=5 where id=1”);
conn.commit();
conn.rollback();

commit事务已经结束了,再rollback也没有用,数据已经永久生成了


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明jdbc rollback