JAVA中的通过JDBC事务批量提交的问题,我的代码如下,问题是不回滚.大神帮我看看什么原因

booleanisInsertOk=true;//插入成功否Connectionconn=getConnection();//获取数据库连接PreparedStateme... boolean isInsertOk = true;//插入成功否
Connection conn = getConnection();//获取数据库连接
PreparedStatement ps = null;
try {
MyLog.e(">>>开始<<<");
//设置事务的提交方式为非自动提交:
conn.setAutoCommit(false);
MyLog.e(">>>已经设置不自动提交<<<"+conn.getAutoCommit());
int i=0;
for(List<InsertHolder> item:datas)
{
i++;
if(i<=5)
{
String sql="insert into aaaaaa(data1,data2) values('啊啊啊啊啊啊啊啊啊啊','0123456789');";
ps= conn.prepareStatement(sql);
ps.executeUpdate();
}else{
int k=1/0;//这一句会导致程序中断.意在让SQL回滚
}
// String sql = getInsertSQL(table,item);
// ps = getPreparedStatement(conn,sql,item);
// if(ps != null)ps.execute();
}
MyLog.e(">>>提交之前<<<");
//在try块内添加事务的提交操作,表示操作无异常,提交事务。
conn.commit();//此处都没有执行到
MyLog.e(">>>全部提交了<<<");
} catch (SQLException e) {
isInsertOk = false;
MyLog.e(">>>出错,准备rollback<<<");
try {
//.在catch块内添加回滚事务,表示操作出现异常,撤销事务:
conn.rollback();
MyLog.e(">>>已经rollback了<<<");
} catch (SQLException e1) {
MyLog.e(">>>rollback失败了<<<");
e1.printStackTrace();
}
e.printStackTrace();
}finally{
//设置事务提交方式为自动提交:
MyLog.e(">>>准备回复<<<");
try {conn.setAutoCommit(true);} catch (SQLException e) {MyLog.e(">>>回复出错<<<");e.printStackTrace();}
MyLog.e(">>>已经回复了<<<");
try {if(ps!=null)ps.close();} catch (SQLException e) {e.printStackTrace();}
MyLog.e(">>>关闭<<<");
}
MyLog.e(TAG,"插入数据量:"+isInsertOk);
return isInsertOk;
这是打印出来的LOG。从LOG上看并没有执行commit()方法,并且执行了回滚方法

这是数据库中插入的数据(问题就在这里,为啥没有commit却还插入成功了前面的5条呢。应该回滚了一条也没有猜对。)
通过在“int k=1/0;//这一句会导致程序中断.意在让SQL回滚”这句之前线程沉睡10秒的方式发现该过程中数据库内已经插入上述的数据。也就是说实际上我设置的conn.setAutoCommit(false);不起作用。
求大神指点需要的话我加分。

《《《《《《《问题中SQLException e1已经改成了Exception问题不好改这里说明下》》》》》》》
展开
 我来答
puziguo
2016-10-10 · TA获得超过1928个赞
知道小有建树答主
回答量:884
采纳率:86%
帮助的人:810万
展开全部

getPreparedStatement(conn,sql,item);

  方法是干啥的,贴出来


其实问题很简单

MyLog.e(">>>提交之前<<<");
//在try块内添加事务的提交操作,表示操作无异常,提交事务。
            conn.commit();//此处都没有执行到
            MyLog.e(">>>全部提交了<<<");
} catch (SQLException e) {
isInsertOk = false;
MyLog.e(">>>出错,准备rollback<<<");
 try {

上面的那个SQLException e
 换成  Exception e  应该就可以了,

更多追问追答
追问
额。。为了测试这个方法已经被注释掉了,不必在意(这个是我写的一个初始化PreparedStatement并且给SQL语句中参数赋值的方法)。
追答
SQLException  是获取不到你设定的那个异常的,所以catch里面代码不会执行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
308xiaobao
高粉答主

2016-10-10 · 每个回答都超有意思的
知道大有可为答主
回答量:2.6万
采纳率:95%
帮助的人:2749万
展开全部
conn.rollback();回滚的放在了catch (SQLException e) 中,而你抛出的异常又不是SQLException ,所以没回滚。
conn.rollback();放到catch(Exception e1)中
追问
抱歉,大意了,为了方便大家看中断,我临时加了除0中断,其实原来是SQL错误中断是会执行到回滚方法的。我补充了问题,麻烦再帮我看看。。。
追答
不是很明白你要问什么了,既然回滚没什么问题了,你的意思难道是你catch Exception了把conn.rollback();放到里面也没有回滚吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
smileXbel
2016-10-10 · TA获得超过277个赞
知道小有建树答主
回答量:423
采纳率:100%
帮助的人:258万
展开全部
报错的是 line 134 是哪一行 text.java.48 又是哪一行
追问
48是我的调用类中的代码行,这里跟方法体没有关系的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
云涧断崖
2016-10-10
知道答主
回答量:10
采纳率:0%
帮助的人:3.6万
展开全部
不要catch SQLException,直接catch Exception。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式