注意:控制事务的Connection必须是同一个:执行sql的connection与开启事务的connection必须是同一个,才能对事务进行控制
创建一个JDBC事务:
实例:开启jdbc的手动事务,当sql语句没有错误的时候提交事务,否则回滚事务
public class Jdbc {
public static void main(String[] args) {
// 1:注册驱动
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
// 2:获得connection
conn = DriverManager.getConnection("jdbc:mysql:///web", "root", "123456");
conn.setAutoCommit(false);
// 3:获得执行平台
Statement stmt = conn.createStatement();
// 4:操作数据库
stmt.executeUpdate("insert into account values(3,'jack',3000)");
conn.commit();
stmt.close();
conn.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
DBUtils工具是JDBC的一个简单封装,dao层操作数据库用的最多的是DBUtils,所以JDBC的一些相应的操作看不到了
实例:
使用之前需要在src文件夹中添加c3p0-config.xml添加连接池工具包:
public class DBUtilsDemo {
public static void main(String[] args) {
Connection conn = null;
try {
/*
* QueryRunner runner=new QueryRunner(DataSourceUtils.getDataSource());
* 要保证sql语句与事务的Connection相同所以换一种创建方式
*/
//需要事务控制的时候就使用不传参的,不需要事务控制时(一条sql语句...)使用传入连接池的创建方法
//sql一般在dao层,需要控制事务就手动传入Connection
QueryRunner runner = new QueryRunner();
conn = DataSourceUtils.getConnection();
// runner.update("update account set password='1234556' where
// name='tom'");
// 开启事务
conn.setAutoCommit(false);
runner.update(conn, "update account set password='1234556' where name='tom'");
// 提交或者回滚
conn.commit();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
事务特性是什么? ACID
1)的性能很好但是太不安全了,4)很安全但是性能不好