JDBC_12_JDBC事务

JDBC事务

  • JDBC中事务默认自动提交,每执行一次SQL就会自动提交一次。 这样的话可能出现数据安全性问题。

  • connection.setAutoCommit(false) false代表关闭自动提交事务 true代码自动提交事务

  • connection.commit(); 没有异常 手动提交事务

  • connection.rollback(); 存在异常 手动回滚事务

  • 代码:

```

        import java.sql.Connection;
        import java.sql.DriverManager;
        import java.sql.PreparedStatement;
        import java.sql.SQLException;

        /**
         *  JDBC操作数据库,模拟银行转账
         *  connection.setAutoCommit(false)  false代表关闭自动提交事务  true代码自动提交事务
         *  connection.commit();     没有异常  手动提交事务
         *  connection.rollback();   存在异常  手动回滚事务
         *
         */

        public class JDBCTest09 {
            public static void main(String[] args) throws SQLException {

                //创建数据库连接对象
                Connection connection=null;
                PreparedStatement preparedstatement=null;
                int count=0;

                try {
                    //注册驱动
                    Class.forName("com.mysql.cj.jdbc.Driver");

                    //获取连接
                    connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai",
                            "root","123456");

                    //将JDBC的事务自动提交机制更改为手动提交
                      connection.setAutoCommit(false);

                    //获取预编译数据库对象,并编译SQL语句
                    String sql="UPDATE t_act SET BALANCE=? WHERE ACTNO=?";
                    preparedstatement=connection.prepareStatement(sql);

                    //给占位符传值
                    preparedstatement.setDouble(1,10000);
                    preparedstatement.setInt(2,111);

                    //执行sql语句
                    count=preparedstatement.executeUpdate();

                    //制造异常  程序中断执行.  执行后发现前面的SQL语句生效了,更改了账户中的余额,但是另一个账户的余额确没有增加,造成数据丢失。
                    //String str=null;
                    //str.toString();

                    //再次给占位符传值,给第二个账户赋值(转账)
                    preparedstatement.setDouble(1,10000);
                    preparedstatement.setInt(2,222);

                    //再次执行SQL
                    count+=preparedstatement.executeUpdate();

                    //输出   如果count==2,那么代表执行了两次sql
                    System.out.println(count==2?"转账成功":"转账失败");

                    //程序走到这里,说明以上程序没有异常,事务结束,手动提交事务
                      connection.commit();

                   } catch (ClassNotFoundException | SQLException e) {

                    // 如果程序执行到这里说明存在异常,那么数据就需要回滚,回滚事务,以保证数据的安全性。

                    if(connection!=null){

                        connection.rollback();
                    }

                    e.printStackTrace();

                }finally {

                    // 释放资源
                    if(preparedstatement!=null){
                        try {
                            preparedstatement.close();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    }

                    if(connection!=null){
                        try {
                            connection.close();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    }

                }

            }
        }
posted @ 2021-04-17 16:37  失昼  阅读(54)  评论(0)    收藏  举报