事务-mysql

Java基础

浏览数:48

2019-8-23

概念:事务指逻辑上的一组操作,组成这组操作的各个单元。要么全部成功,要么全部不成功。 例如: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);
        }
    }

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

异常
结果

作者:小小蒜头