当前位置: 首页 > news >正文

Java-事务管理

1、事务的概念:
  事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。

2、 管理事务:

  2.1. 数据库默认的事务
    数据库默认支持事务的,但是数据库默认的事务是一条sql语句独占一个事务,这种模式,意义不大。
  2.2. 手动控制事务
    如果希望自己控制事务也是可以的:
    start transaction;
    -- 开启事务,在这条语句之后的所有的sql将处在同一事务中,要么同时完成要么同时不完成
      ......
    --事务中的sql在执行时,并没有真正修改数据库中的数据
    commit;
    -- 提交事务,将整个事务对数据库的影响一起发生
    rollback;
    -- 回滚事务,将这个事务对数据库的影响取消掉

   2.3. JDBC中控制事务
    Connection conn
    PreparedStatement pstat
    ResultSet rs
    当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,可使用下列语句:
    conn.setAutoCommit(false);
    --关闭自动提交后,conn将不会帮我们提交事务,在这个连接上执行的所有sql语句将处在同一事务中,需要我们是手动的进行提交或回滚
    conn.commit();
    --提交事务
    conn.rollback();
    --回滚事务
    也可以设置回滚点回滚部分事务。
    Savepoint sp = conn.setSavepoint();
    conn.rollback(sp);
    --注意,回到回滚点后,回滚点之前的代码虽然没被回滚但是也没提交呢,如果想起作用还要做commit操作.

public class TranDemo {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstat = null;
        Savepoint sp =null;
        try{
            //String url = "jdbc:mysql://ip:3306/database";
            String url = "jdbc:mysql:///day20";
            Class.forName("com.mysql.jdbc.Driver");
            conn= DriverManager.getConnection(url, 
                    "root", "root");
            //开启事务
            conn.setAutoCommit(false);
            //a-520
            pstat = conn.prepareStatement("update account set " +
                    "money=money-? where name=?");
            pstat.setDouble(1, 520);
            pstat.setString(2, "a");
            pstat.executeUpdate();
            //b+520
            pstat = conn.prepareStatement("update account set " +
                    "money=money+? where name=?");
            pstat.setDouble(1, 520);
            pstat.setString(2, "b");
            pstat.executeUpdate();
            //设置回滚点
            sp= conn.setSavepoint();
            //b消费了1040
            pstat = conn.prepareStatement("update account set " +
                    "money=money-? where name=?");
            pstat.setDouble(1, 1040);
            pstat.setString(2, "b");
            pstat.executeUpdate();
            //人为抛出一个异常
            int x = 3/0;
            //a+1040
            pstat = conn.prepareStatement("update account set " +
                    "money=money+? where name=?");
            pstat.setDouble(1, 1040);
            pstat.setString(2, "a");
            pstat.executeUpdate();
            //提交事务
            conn.commit();
        }catch (Exception e) {
            if(conn!=null){
                if(sp!=null){
                    try {
                        //回滚到到sp
                        conn.rollback(sp);
                        //将转账的操作提交
                        conn.commit();
                    } catch (SQLException e1) {
                        e1.printStackTrace();
                    }
                }else{
                    try {
                        //回滚事务开启的地方
                        conn.rollback();
                    } catch (SQLException e1) {
                        e1.printStackTrace();
                    }
                }
            }
        }finally{
            //关闭数据库连接。。。。
        }
    }
}

 

转载于:https://www.cnblogs.com/tongxuping/p/7003139.html

相关文章:

  • 和菜鸟一起学linux内核源码之基础准备篇
  • docker安装nodejs
  • 第六课 自己实现路由改进,针对不同请求的路径进行响应
  • 开启归档模式,归档日志已满处理方法
  • C++ 对象模型具体评论(特别easy理解力)
  • 使用pyenv管理不同版本的python
  • 剑指Offer-- 树的子结构
  • 基于SVD实现PCA的图像识别
  • zw·准专利·高保真二值图细部切分算法
  • [ IOS ] iOS-控制器View的创建和生命周期
  • 使用Java对文件进行解压缩
  • 《自信力~成为更好的自己》晨读笔记
  • Spring aop:decare-parent 为类增加新的方法
  • 在resin配置參数实现JConsole远程监控JVM
  • 同样加班 不同收获(转)
  • 【Leetcode】101. 对称二叉树
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【Leetcode】104. 二叉树的最大深度
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • DOM的那些事
  • HTML5新特性总结
  • HTTP那些事
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Js基础知识(一) - 变量
  • Laravel 中的一个后期静态绑定
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Linux后台研发超实用命令总结
  • Material Design
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • pdf文件如何在线转换为jpg图片
  • Python十分钟制作属于你自己的个性logo
  • Rancher如何对接Ceph-RBD块存储
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 番外篇1:在Windows环境下安装JDK
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 和 || 运算
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 数据仓库的几种建模方法
  • 网络应用优化——时延与带宽
  • mysql面试题分组并合并列
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (52)只出现一次的数字III
  • (HAL库版)freeRTOS移植STMF103
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (力扣记录)235. 二叉搜索树的最近公共祖先