jfinal,renderFile下载文件,点击取消后事务不能回滚

发布于 2021-12-01 22:49:20 字数 784 浏览 912 评论 10

代码如下:
@Before(Tx.class)  public void downloadApp() throws SQLException{ try {
        Long id = Long.valueOf(getPara("id"));
        AppDownload appDownload = AppDownload.dao.findById(id); long downloads = appDownload.get("downloads");
        String filename = appDownload.get("name");                renderFile(new File(PathKit.getWebRootPath()+File.separator+"uploadapp"+File.separator+filename));

        downloads += 1; 
        appDownload.set("downloads",downloads);
        appDownload.update();
    } catch (Exception e) {
        DbKit.getConfig().getThreadLocalConnection().rollback();
        e.printStackTrace();
    } }
我点击下载按钮,成功下载后,数据库中下载次数downloads+1, 但是在下载框点取消按钮后,事务咋不能回滚啊?数据库中的downloads依然继续加1;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

长安忆 2021-12-03 06:00:30

满意请采纳

别低头,皇冠会掉 2021-12-03 06:00:23

你的逻辑有问题 应该自己去模拟个下载和取消 然后点击下载 直接数量+1 然后下载文件

百思不得你姐 2021-12-03 06:00:23

谢谢各位大神,

沙与沫 2021-12-03 06:00:19

有没有什么解决办法,在取消下载的同时,让downloads不再加+1,保持原状,我百度了没找到解决方案

噩梦成真你也成魔 2021-12-03 06:00:16

回复
跟踪调试jfinal的FileRender中的render,看看取消的时候会有什么发生,按需求改造就是了

英雄似剑 2021-12-03 05:59:56

谢谢

左岸枫 2021-12-03 05:51:04

您的回答让我意识到我的知识还严重欠缺,谢谢

离不开的别离 2021-12-03 05:38:28

因为render系列方法只是一个“通知”的作用,实际上是在执行完方法后才真正的开始做渲染,所以你这里是在数据库操作完成后才开始接收数据,这样你点取消当然没有用了。

凯凯我们等你回来 2021-12-03 03:45:16

谢谢 啦

回忆凄美了谁 2021-12-02 00:21:54

AppDownload appDownload = AppDownload.dao.findById(id); long downloads = appDownload.get("downloads");

String filename = appDownload.get("name");

renderFile(new File(PathKit.getWebRootPath()+File.separator+"uploadapp"+File.separator+filename));

downloads += 1; 

appDownload.set("downloads",downloads);

appDownload.update();

给你分析一下你的代码BUG:

开启事务...事务级别READ_COMMIT

Java业务层:

读取downloads数字,downloads=1

下载文件...等待了好久

其他线程也做了同样的事情...downloads=1(当前用户感觉不到的)....

下载完了!当前线程downloads=downloads+1为2

OK,更新到数据库啦!

 码哥,又没感觉到不对啊?

downloads在数据库里面为2,不是预期的3啊。

OK,此BUG不修,码农跑路,老板等死。

======================

怎么避免:

如果你想用数据库事务SERIALIZABLE(值8)然后再开启下载然后再update,这也不行,这回导致线程等待很长时间,性能最差。

最好的做法是,等下载完成,开启事务级别SERIALIZABLE执行一条语句:update set downloads=downloads+1 where id=1234

这样就搞定了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文