概念:事务指逻辑上的一组操作,组成这组操作的各个单元。要么全部成功,要么全部不成功。 例如: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);
}
}
如果中间有异常,在异常之前执行的事务向保留,就可以设置事物的回滚点。
异常 结果
网友评论