MySQL事务笔记 事例回滚
来源:互联网 发布:js隐式全局变量 编辑:程序博客网 时间:2024/05/23 07:23
事务的概念 : 一组要么同时执行成功,要么同时执行失败的SQL语句,是数据库操作一个执行单元
- 事务的四大特性: *
*1.原子性:事务是应用中最小的执行单元
*2.一致性:事务的执行结果,必须使数据库从一个一致性的状态,变成另一个一致性的状态。如果中途有一个出错 则会整体失败 将回滚值最初未执行的状态
*3.隔离型:各个事务互不干扰 任意一个事务的内部操作不会对其他并发的事务都是隔离的 也就是说 并发执行的事务之间不能看到对方的中间状态
*4.持续性:也称持久性:是指 事务一旦提交 对数据的所有改变 都是永久的 通常就是保存进物理数据库中
JDBC中默认自动提交事务 一旦事务失败 则会执行回滚操作
可以通过 connection.setAutoCommit(false); ————–修改关闭自动提交
connection.commit; —————手动提交事务
下面事例一个事务失败回滚的操作
以 testjdbc数据库的t_test表 做例子 先清空表数据
事例正确的操作:
public class Affairs { private String driver; private String url; private String user; private String password; public void initParam(String paramFile) { Properties prop = new Properties(); try { prop.load(new FileInputStream(paramFile)); } catch (FileNotFoundException e) { System.out.println("配置文件未找到!"); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } driver = prop.getProperty("driver"); url = prop.getProperty("url"); user = prop.getProperty("user"); password = prop.getProperty("password"); } public void test() throws SQLException { try { Class.forName(driver); } catch (ClassNotFoundException e) { System.out.println("没有找到你所调用的类"); e.printStackTrace(); } Connection connect = null; PreparedStatement pstmt = null; PreparedStatement pstmt2 = null; try { // 第一次执行 try { connect = DriverManager.getConnection(url, user, password); } catch (SQLException e1) { System.out.println("连接数据库失败"); e1.printStackTrace(); } try { connect.setAutoCommit(false);// 修改关闭自动提交 } catch (SQLException e1) { System.out.println("关闭自动提交失败"); e1.printStackTrace(); } // 关闭事务自动提交 JDBC默认自动提交 true try { pstmt = connect.prepareStatement("insert into t_test(username,pwd) values (?,?)"); } catch (SQLException e1) { System.out.println("执行SQL语句失败"); e1.printStackTrace(); } // 插入第一个正确的数据 pstmt.setObject(1, "叶良辰"); pstmt.setObject(2, "666"); pstmt.execute(); System.out.println("插入第一个记录!"); // 使用线程休息5S try { System.out.println("------------------CPU休息5S:-----------------------------"); Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { pstmt2 = connect.prepareStatement("insert into t_test (username,pwd) values (?,?)"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 插入第一个错误的数据 pstmt2.setObject(1, "赵日天"); pstmt2.setObject(2, "556"); pstmt2.execute(); System.out.println("插入第二个记录!"); try { connect.commit(); System.out.println("插入数据失败! 即将回滚至初始状态"); connect.rollback(); e.printStackTrace(); } // 提交数据 } finally { if (pstmt2 != null) { try { pstmt2.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (pstmt != null) { try { pstmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (connect != null) { try { connect.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException, SQLException { Affairs af = new Affairs(); af.initParam("E:/javaiotest/mysql.ini"); af.test(); }}
表内已经正确添加数据:
将代码第二次添加的语句 弄错
pstmt2 = connect.prepareStatement("insert into t_test (username,pwd) values (?,?,?)");
第一个插入正确的 第二个是错误的 事务需要一组数据都成功才算成功 否则失败 回滚 未执行之前的状态
第二条记录插入失败 :
0 0
- MySQL事务笔记 事例回滚
- MySQL事务回滚
- java事务回滚 MySql
- mysql事务回滚实例
- mysql中的事务回滚
- java mysql事务回滚
- Mysql-spring事务回滚
- MySQL事务的回滚
- MySql事务无法回滚的原因
- MySql事务无法回滚的原因
- mysql存储过程事务回滚
- mysql事务回滚的问题
- mysql事务的提交和回滚
- c++ mysql事务提交及回滚
- MySql事务无法回滚的原因
- mysql 事务的提交和回滚
- MySQL存储过程事务回滚
- mysql(九)事务操作(回滚)
- 不排序找到第k大的值
- 排序总结(三)之---堆排序
- 禁用系统的Ctrl+Alt+Left/Right(方向键)
- I/O & Java in ACM
- 数据库知识
- MySQL事务笔记 事例回滚
- Qt使用 QSqlTableModel 模型操作数据库
- Unknown class ViewController in Interface Builder file
- 习题2-6 排列 解题报告
- Qt配置winCE环境中BUG总结
- Python标准库——一日一库
- 23.Oracle数据库SQL开发之 SQLPlus使用——查看表结构
- swift中函数的形参和返回值
- Linux 命令 & 快捷键