关于jfinal事务的用法,请高手帮看一下谢谢!

public Map save(String sessionId,String smspmsName, String smsCompany, String smspmsId) {

    final String sql = "insert into sms_user (telno,user_name,dept) values ('" + smspmsId + "','" + smspmsName + "','" + smsCompany + "')";
    boolean success = Db.tx(new IAtom() {
        @Override
        public boolean run() throws SQLException {
            try {
                Db.update(sql);
            } catch (Exception e) {
                e.printStackTrace();
                log.error("新增联系人失败:" + e.getMessage());
                return false;
            }
            return true;
        }
    });
    if(success){
        CommonService commonService = Duang.duang(CommonService.class);
        commonService.insertOptLog(sessionId, CodeUtil.code("预警联系人管理"), CodeUtil.code("新增预警联系人:") + smspmsId, "");
        return renderSuccess("success");
    }else{
        return renderFailed("新增预警联系人失败");
    }
    
}

请大神们帮我看一下这个事务的用法对吗???

评论区

lyh061619

2016-12-13 20:30

这样写是没错的,但是如当第一条抛出异常是不会执行第一条更新语句,但是如果第一条sql执行成功,第二条语句执行失败的话就会导致一条成功一条失败,所以建议你把两都放到事物中去。

FS心情

2016-12-14 09:52

@lyh061619 非常感谢,您是对的,我这个脑子改修修了。哈哈

lyh061619

2016-12-14 10:25

@FS心情 不客户,多支持社区^_^!!

nbjgl

2016-12-14 22:18

@lyh061619 你写的这个 Duang.duang(CommonService.class) 是干嘛的?

lyh061619

2016-12-15 08:40

@nbjgl JFinal APO极简设计,作用是调用服务层CRUD。

FS心情

2016-12-15 19:47

@nbjgl 调用一个公共是Service,放在baseService里也可以,只不过单独拿出来,可以随意调用

FS心情

2016-12-15 19:49

@lyh061619 我在Controller里每一个方法里都写了 Duang.duang(xxx.class),这么写可以吗?还是要单独放在Controller定义一个就行了?

lyh061619

2016-12-15 21:02

@FS心情 单独放在Controller定义一行定义也是可以的主要看你服务层怎么设计的,比如我喜欢这样public static final XXServer me = new XXServer(),然后在controller方法用是直接 XXServer.me.xxx(),这样调用的,这个XXserver.me其实也是共享对象,但在这个XXServer中对象分配一定要用new重新分配新的内存空间,要不然多线程下,存在共享对象引用的话会产生数据混乱的。

阿帕奇

2018-03-08 10:35

@lyh061619 你这样也会出现问题吧?因为全局变量,static关键字也修饰了的;在服务启动的时候就是先初始化这些全局变量字段的;如果你在其他地方统一调用的话就出现多线程同时调用一个对象的问题吧?

lyh061619

2018-03-08 11:07

@阿帕奇 1、服务层的设计本身就是单例无状态的;2、静态修饰对象在内存中始终保一份内存地址;何来的线程安全问题?

阿帕奇

2018-03-08 13:52

@lyh061619 因为业务层中的public static final XXServer me = new XXServer(); 这个me对象是一开始就new在了内存中的,意味着所有的调用都是在使用同一个对象,而并不会再去new一个新对象啊!

热门反馈

扫码入社