给大家推荐个靠谱的公众号程序员探索之路,大家一起加油
所用到的工具类介绍:http://blog.csdn.net/yueloveme/article/details/77653690
原生
package com.qf.zzh;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.qf.dbutils.c3p0Utils;
public class test {
/**
* @param args
*/
// 脏读:值为1,TRANSACTION_READ_UNCOMMITTED
// 不可重复读:值为2,TRANSACTION_READ_COMMITTED
// 虚读和幻读:值为4,TRANSACTIION_REPEATABLE_READ
// 完整的隔离性:值为8,TRANSACTION_SERIALIZABLE
// 时机开发当中常用的是第二个和第三个
// oracle的默认是2
// mysql的默认是4
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn = null;
PreparedStatement ps = null;
try {
conn = c3p0Utils.getConnection();
// 设置提交方式为非自动提交
// 一旦autocommit为false
// 你必须调用conn.commit()才会提交
conn.setAutoCommit(false);
// 设置事务的隔离级别
// 不要写数字,要引用类的常量
// 1.可读性强
// 2,API有一日升级了,4代表别的意思了,但是TRANSACTION_REPEATABLE_READ它代表的意思永远不会改变
// 即使这句话不写也是默认值为TRANSACTION_REPEATABLE_READ 因为连接的是mysql数据库
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
// 1左移32位然后减1
// System.out.println((1<<32)-1);
// int类型的最大值
// System.out.println(Integer.MAX_VALUE);
String sql = "insert into tableb(id,name) values(10,'asdf')";
ps = conn.prepareStatement(sql);
ps.executeUpdate();
// 手动设置异常 则 这个事务没执行完 也就是没有提交 所有 得回滚 就没有添加进去
// 那么此时数据库没有永久保存
int num = 5 / 0;
sql = "insert into tableb(id,name) values(11,'asdf')";
ps = conn.prepareStatement(sql);
ps.executeUpdate();
System.out.println("YES");
conn.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
// e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} finally {
try {
if (conn != null) {
conn.close();
}
if (conn != null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
工具类
package com.qf.zzh;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import com.qf.dbutils.c3p0Utils;
public class TestDbutils {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 选择空参构造,使得queryrunner对象并不能拥有一个连接。
QueryRunner qr = new QueryRunner();
// 从池中获取一个连接
Connection conn = c3p0Utils.getConnection();
try {
// 把这连接设置成不自动连接
conn.setAutoCommit(false);
String sql = "insert into tableb(id,name) values(30,'qwer')";
// qr对象是用一个不自动提交的conn进行sql语句执行。
qr.update(conn, sql);
int num = 5 / 0;
sql = "insert into tableb(id,name) values(31,'qwer')";
qr.update(conn, sql);
conn.commit();
System.out.println("YES");
} catch (SQLException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
当然还有一个问题 就是 如果连接自动提交设置为false那么归还的时候也是false,
* 那么下一次取出来的连接还是为false,这显然不是想要的,其实在连接池的配置文件中每次用的时候都置为了true