1.事务
(1)相关概念
1)定义: 事务就是逻辑上的一系列操作,要么全部执行,要么全部都不执行。
2)自动提交: 数据库默认事务是自动提交的,也就是发一条sql他就执行一条
(2)数据库开启事务的命令
1)start transaction
开启事务,这条语句之后的sql语句将处在一个事务中,这些sql语句不会立即执行,直到commit
2)commit
提交事务,一旦提交事务,事务中的所有sql才会执行
3)rollback
回滚事务,将之前的sql全部取消
2.使用事务
(1)jdbc默认使用的是自动提交,当jdbc程序向数据库获得一个connection对象时,默认情况下这个connection对象会自动向数据库提交在它上面发送的sql语句
(2)jdbc事务控制语句
1)Connection.setAutoCommit(false)
设置不自动提交事务,实际上相当于start transaction
2)Connection.rollback()
手动回滚事务
3)Connection.commit()
手动提交事务
4)Connection.setSavepoint()
设置事务回滚点,设置之后,rollback只会回滚到回滚点之后,通常会跟着commit,否则就没有意义了
5)Connection.setTransactionIsolation()
设置事务隔离级别
6)Connection.getTransactionIsolation()
获得事务隔离级别
(3)实例
class Demo
{
@Test
public void test()
{
Connection conn = null;
PreparedStatement ps1 = null;
PreparedStatement ps2 = null;
Savepoint sp = null;
try
{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///day11", "root","root");
conn.setAutoCommit(false); //开启事务
ps1 = conn.prepareStatement("update account set money = money+100 where name=?");
ps1.setString(1, "b");
ps1.executeUpdate();
ps2 = conn.prepareStatement("update account set money = money-100 where name=?");
ps2.setString(1, "a");
ps2.executeUpdate();
sp = conn.setSavepoint(); //设置回滚点
// -----------------------------------
ps1 = conn.prepareStatement("update account set money = money+100 where id=?");
ps1.setInt(1,Integer.parseInt("9999999999999999999999999999999")); //会抛出异常
ps1.executeUpdate();
conn.commit();
}
catch (Exception e)
{
e.printStackTrace();
try
{
if(sp != null) //说明是保存点之后的操作出错
{
conn.rollback(sp); //回滚到回滚点sp
conn.commit(); //一定要提交!
}
else
{
conn.rollback(); //保存点之前就有错了,所以全部回滚
}
}
catch (SQLException e1)
{
e1.printStackTrace();
}
}
finally
{
DaoUtil.close(conn, ps1, null);
DaoUtil.close(conn, ps2, null);
}
}
}