博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java-事务管理
阅读量:6509 次
发布时间:2019-06-24

本文共 3193 字,大约阅读时间需要 10 分钟。

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

你可能感兴趣的文章
中断小笔记
查看>>
C#委托、事件、消息(入门级)
查看>>
FreeBinary 格式说明
查看>>
使用Spring Cloud和Docker构建微服务
查看>>
NB-IoT的成功商用不是一蹴而就
查看>>
九州云实战人员为您揭秘成功部署OpenStack几大要点
查看>>
1.电子商务支付方式有哪些 2.比较不同支付方式的优势劣势
查看>>
医疗卫生系统被爆漏洞,7亿公民信息泄露……
查看>>
神秘函件引发的4G+与全网通的较量
查看>>
CloudCC:智能CRM究竟能否成为下一个行业风口?
查看>>
追求绿色数据中心
查看>>
Web开发初学指南
查看>>
探寻光存储没落的真正原因
查看>>
高通64位ARMv8系列服务器芯片商标命名:Centriq
查看>>
中国人工智能学会通讯——融合经济学原理的个性化推荐 1.1 互联网经济系统的基本问题...
查看>>
戴尔为保护数据安全 推出新款服务器PowerEdge T30
查看>>
今年以来硅晶圆涨幅约达40%
查看>>
构建智能的新一代网络——专访Mellanox市场部副总裁 Gilad Shainer
查看>>
《数字视频和高清:算法和接口》一导读
查看>>
《中国人工智能学会通讯》——6.6 实体消歧技术研究
查看>>