赞
踩
示例数据库表:
示例代码:
public static void main(String[] args) { Connection conn=null; PreparedStatement ps=null; try { Class.forName("com.mysql.cj.jdbc.Driver"); conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/student?serverTimezone=GMT%2B8", user, password); //开始事务 conn.setAutoCommit(false); String sql="update test set name=? where id=?"; ps=conn.prepareStatement(sql); ps.setString(1, "lisi"); ps.setInt(2,1001); int count=ps.executeUpdate(); String nothing=null; nothing.toString(); ps.setString(1, "zhangsan"); ps.setInt(2, 1002); count+=ps.executeUpdate(); System.out.println(count==2?"成功":"失败"); //提交事务 conn.commit(); }catch (Exception e){ if (conn!=null){ try { conn.rollback(); //回滚事务 } catch (SQLException e1) { e1.printStackTrace(); } } e.printStackTrace(); }finally { if(ps!=null){ try { ps.close(); }catch (Exception e){ e.printStackTrace(); } } if (conn!=null){ try { conn.close(); }catch (Exception e){ e.printStackTrace(); } } }
正常情况下,当程序抛出异常后,应当执行事务回滚操作,不执行程序中的sql语句改变id=1001的名字,可是程序运行后,数据表中id=1001的名字仍然发生了改变。
数据表数据仍改变,说明事务并未回滚,在程序无错误的前提下,那么问题则可能出在数据表本身,想到存储引擎的特点,InnoDB存储引擎支持事务,但MyISAM和MEMORY存储引擎不支持事务,于是通过指令show variables like '%storage_engine%';
查看当前数据表的存储引擎。
可以看到default_storage_engine(永久表的默认存储引擎)是MyISAM,于是找到问题所在。
(default_tmp_storage_engine是临时表的默认存储引)
从网上找到的修改mysql数据库默认存储引擎的方法:
修改my.cnf,在配置文件里面将参数default-storage-engine=MyISAM修改为default-storage-engine=InnoDB,然后重启数据库服务。
但是,已经创建的表的存储引擎仍然为MyISAM。
还需要通过ALTER TABLE 表名 ENGINE = InnoDB;
来修改已创建的表的存储引擎。
修改完成后重新运行程序问题解决。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。