事务-mysql

作者: 小小蒜头 | 来源:发表于2017-09-27 12:24 被阅读69次

    概念:事务指逻辑上的一组操作,组成这组操作的各个单元。要么全部成功,要么全部不成功。 例如:A-----B转账,对应于如下两条sql语句:

    update account set money=money+100 where name='b';
    update account set money=money-100 where name='a';
    

    上面两条sql语句必须一起执行,A---B转账是相互的,不可能一个钱增加了,另外一个钱不变。

    数据库默认事务是自动提交的,也就是发一条sql它就执行一条。如果想多条sql放在一个事务中执行,则需要如下语句:

    数据库开启事务命令

    • start transaction 开启事务
    • rollback 回滚事务
    • commit 提交事务

    如果执行过程中语句抛出异常,在还没有commit之前,事务会回滚。

    使用事务

    当JDBC程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的sql语句。若想关闭这种默认提交方式,让多条sql在一个事务中执行,可使用下列语句:

    JDBC控制事务语句

    • Connection.setAutoCommit(false);start transaction
    • Connection.rollback();rollback
    • Connection.commit();commit

    测试一个转账小程序

    建表,插入数据:

    create table account(
        id int primary key auto_increment,
        name varchar(40),
        money float
    );character set utf8 collate utf8_general_ci;
    
    insert into account(name,money) values('aaa',1000);
    insert into account(name,money) values('bbb',1000);
    insert into account(name,money) values('ccc',1000);
    
     @Test
        public void test1() {
            Connection conn = null;
            //用Statement去做
            PreparedStatement st = null;
            ResultSet rs = null;
            try {
                conn = JdbcUtils.getConnection();
                conn.setAutoCommit(false);//这句话就相当于start transaction
                String sql1 = "update account set money=money+100 where name='aaa'";
                String sql2 = "update account set money=money-100 where name='bbb'";
                st = conn.prepareStatement(sql1);
                st.executeUpdate();
    
                st = conn.prepareStatement(sql2);
                st.executeUpdate();
    
                conn.commit();//事务提交,最后必须要commit
            } catch (Exception e) {
                throw new RuntimeException(e);
            } finally {
                JdbcUtils.release(conn, st, rs);
            }
        }
    

    如果中间有异常,在异常之前执行的事务向保留,就可以设置事物的回滚点。

    异常 结果

    相关文章

      网友评论

      本文标题:事务-mysql

      本文链接:https://www.haomeiwen.com/subject/nnmyextx.html