事务:事务是逻辑上的一组操作,这组操作要么同时执行要么同时不完成
事务的管理:默认情况下,数据库会自动管理事务,管理的方式是一条语句就独占一个事务。
如果需要自己控制事务也可以通过如下命令开启/提交/回滚事务
start transaction
commit
rollback
jdbc的事务管理:
conn.setAutoCommit(false)//设置自己开启事务
conn.commit()//提交事务
conn.rollback()//回滚事务
SavePoint sp=con.setSavePoint()//设置回滚点
conn.rollback(sp)//回滚到指定的回滚点
案例:
数据库:
mysql> create table account(
-> id int primary key anto_increment,
-> name varchar(20),
-> money double
);
查看数据库:
mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 100 |
| 2 | b | 100 |
+----+------+-------+
TransationDemo:
package cn.itheima.transation;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import cn.itheima.utils.JDBCUtils;
public class TransationDemo1 {
public static void main(String[] args) {
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
Savepoint save=null;
try {
con=JDBCUtils.getConnection();
//数据库默认的是一个sql语句是一个事务,即执行一个sql语句就自动提交了,我们需要更改数据库的默认设置为false
con.setAutoCommit(false);
ps=con.prepareStatement("update account set money=money-10 where name=?");
ps.setString(1, "a");
ps.executeUpdate();
ps=con.prepareStatement("update account set money= money+10 where name=?");
ps.setString(1, "b");
ps.executeUpdate();
//设置一个回滚点,
save=con.setSavepoint();
ps=con.prepareStatement("update account set money=money-10 where name=?");
ps.setString(1, "a");
ps.executeUpdate();
ps=con.prepareStatement("update account set money= money+10 where name=?");
ps.setString(1, "b");
ps.executeUpdate();
int i=1/0;
//提交事务,从开启一个事务到提交一个事务这是一个事务,这些sql语句就在一个事务中
con.commit();
} catch (Exception e) {
e.printStackTrace();
//如果抛出异常了,我也提交事务
try {
if(save==null){//说明没有执行到回滚点就抛出了异常
con.rollback();
}else{//不为null,就回滚到设置的回滚点
con.rollback(save);
con.commit();
}
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}finally{
JDBCUtils.closeResource(rs, ps, con);
}
}
}
再查数据库:
我们发现
mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 90 |
| 2 | b | 110 |
+----+------+-------+