connection.commit 方法执行成功,但数据库中事务未提交。

spring801212 2013-07-11 11:56:29
最近一段程序,程序中有一个事务中执行了一些插入和更新操作。但是偶尔会出现,程序执行了提交语句(“售票成功”已经打印出来了),执行完后发现事务并没有提交,但是也没有报错。大家帮帮忙看下,好急的。数据库连接是使用的c3p0配置的数据库连接池。程序如下:

Connection conn=dataSource.getConnection();
Statement s=conn.createStatement();
try{
conn.setAutoCommit(false);
String insertSql=".........";
s.executeUpdate(insertSql);
// 1.更新动态车次信息
String updatedbussql = "..........";
System.out.println("开始更新动态车次" + busnum);
s.executeUpdate(updatedbussql);
System.out.println("结束更新动态车次" + busnum);
System.out.println("更新动态车次" + busnum + "完成");
// 2.更新当前售票员票情况
String update_staff_bill_use = "..........";
System.out.println("开始更新用户票号");
s.executeUpdate(update_staff_bill_use);
System.out.println("结束更新用户票号");
// 3.更新当前售票点售票金额
String update_tofficesql = "............";
System.out.println("开始更新售票点金额");
s.execute(update_tofficesql);
System.out.println("结束更新售票点金额");

System.out.println("更新售票点金额完成");
// 5.更新动态车次停靠站当前票数
String update_dbus_stop_price = ".............";
System.out.println("开始更新动态车次停靠站当前票数");
s.executeUpdate(update_dbus_stop_price);
System.out.println("结束更新动态车次停靠站当前票数");
System.out.println("更新动态车次停靠站当前票数完成");
System.out.println("开始提交");
conn.commit();
System.out.println("售票成功");
} catch (Exception ee) {
System.out.println("售票过程失败,车次:" + request.getBusnum() + ",时间:"
+ request.getSetoutdate());
ee.printStackTrace();
conn.rollback();
throw ee;
}
...全文
4868 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sw519 2015-12-22
  • 打赏
  • 举报
回复
程序中已经执行了commit成功了,但是数据库中是否真正的执行成功,没有反馈,这个是个问题,我们都是默认他是成功的,但有时候还是会有失败,目前还没有处理此类问题比较好的办法
京都民工 2014-09-15
  • 打赏
  • 举报
回复 1
难道不是在事务和连接断开的时候才真正执行真正的commit吗?
IdIdIddIDId 2014-06-27
  • 打赏
  • 举报
回复
我现在正在遇到这个问题,搞了快两天了,查不出问题
spring801212 2013-07-19
  • 打赏
  • 举报
回复
我现在把程序修改了一下,使用Statement做批处理,情况好像好些,但是心里还是没有底。还是想知道原因,求解。大家是不是在这方面有什么好的经验可以分享一下。
spring801212 2013-07-15
  • 打赏
  • 举报
回复
非常感谢各位的回复。用存储过程其实也是可以的。我主要是想搞清楚到底是什么原因导致了这个问题。如果这样写本身就有问题的话,那不是JDBC是有很大的问题的呀。C3p0会不会出现这样的情况,就是程序通过C3P0获取到了一个连接,并开启了一个事务,在事务中做了所有的SQL,最后要提交之前该连接断掉了,那么连接池会不会自动分配一个新的连接给原来的连接对象引用,这样由新的连接对象执行了commit方法提交,由于原来的连接断掉了,所以新连接对象提交实际上什么也没有做,也不会抛出异常。(呵呵,以上存储猜想,有时间一定要好好拜读下c3p0源码。)各位对此有什么看法。
KevinLiu 2013-07-15
  • 打赏
  • 举报
回复
在事务中做了所有的SQL,最后要提交之前该连接断掉了 那样的话没有提交的事物就卡在那里了,除非认为的COMMIT或者Rollback。 由于这个问题会导致很多的Blocking影响性能,所以应该不会,否则用户早该抱怨了。
Andy__Huang 2013-07-12
  • 打赏
  • 举报
回复
更新数据的事务,你写在程序代码 里就迟早会出现这样的,所以你还是得把事务所移到存储 过程里. 先把事务提交成功再打印,否则给出错误提示,不打印机.
水族杰纶 2013-07-12
  • 打赏
  • 举报
回复
建议用sqlserver的事务去处理
spring801212 2013-07-12
  • 打赏
  • 举报
回复
自己顶一下。很急呀
  • 打赏
  • 举报
回复
引用 5 楼 SQL_Beginner 的回复:
你用的是啥框架还是什么helper class?标准的SqlConnection 没有你程序里的那些API,估计你调用的那个Connection本身就有BUG,你那么就用SmithLiu328 给出的ULR中那些原生的API,要么用些成熟的框架比如说enterprise library,如果只是封装一下的sqlhelper也可以哦,如果你的程序是.net framework 2.0的话。
sorry,看错了,请忽略上面的。
  • 打赏
  • 举报
回复
你用的是啥框架还是什么helper class?标准的SqlConnection 没有你程序里的那些API,估计你调用的那个Connection本身就有BUG,你那么就用SmithLiu328 给出的ULR中那些原生的API,要么用些成熟的框架比如说enterprise library,如果只是封装一下的sqlhelper也可以哦,如果你的程序是.net framework 2.0的话。
spring801212 2013-07-12
  • 打赏
  • 举报
回复
我现在就是有个疑问,使用java里的Connection对象的commit方法提交事务,程序这边只是发送指令给数据库,但数据库提交有没有成功,并没有反馈,这样就不能做出错处理。是不是有什么办法。
KevinLiu 2013-07-12
  • 打赏
  • 举报
回复
类似于微软的例子: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.commit(v=vs.71).aspx
KevinLiu 2013-07-12
  • 打赏
  • 举报
回复
建议你将这些逻辑放到一个事物中去,比如 myConnection.BeginTransaction()等到执行完再COMMIT 如果错误全部回滚

另外如果想查当时是否有更新可以用第三方工具查看日志操作还原当时的SQL语句。

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧