NutzCN Logo
问答 nuzt事务到底怎么写??????
发布于 2851天前 作者 qq_7f92aca5 3495 次浏览 复制 上一个帖子 下一个帖子
标签:

public void add_treenode(Treenode treenode) {
Trans.exec(new Atom(){
public void run() {
dao.insert(treenode);
dao.update(treenode);
}
});
}
这样写为什么不行???????????
到底怎么写啊

10 回复

java语法问题??

public void add_treenode(final Treenode treenode) {
    Trans.exec(new Atom(){
        public void run() {
            dao.insert(treenode);
            dao.update(treenode);
        }
     });
 }

wendal哥 我看过你的视频 , 请问:
1.为什么必须加final?
2.我的dao是注入进来的,如下:
@IocBean
public class BaseDAOImpl implements BaseDAO { //BaseDAOImpl实现BaseDAO接口定义的通用功能
private Class clazz;
@Inject
public Dao dao;
public BaseDAOImpl() {
this.clazz = ((Class) ((java.lang.reflect.ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
}
//下面是增删改查的通用方法
public void insert(T t) {
this.dao.insert(t);
}
。。。。。(省略)
这样,我使用事务 需要注入吗?不注入的话能拿到实例吗?

内部类引用的变量必须是final的, 这java语法的要求.

至于你说 事务和注入的关系, 我有点晕. 操作数据库才存在事务, 而操作数据库需要dao实例, 而dao实例是否从ioc来,这不是硬性要求.

如果你觉得Trans.exec好麻烦, 可以考虑用@Aop事务

@Aop(TransAop.READ_COMMITTED)
public void add_treenode(Treenode treenode) {
    dao.insert(treenode);
    dao.update(treenode);
 }

// 并在MainModule的@IocBy添加如下信息, 以启用事务AOP相关配置.
@IocBy(args={
            "*js", "ioc/",
            "*anno", "net.wendal.nutzbook",
            "*tx" // 这一行.
            })

相关文档: http://nutzam.com/core/aop/aop_trans.html

wendal哥:
1.我是插入一条记录同时删除一条记录,如果不成功可以回滚吗? 怎么写呢?
2.我想让dao.insert(treenode);和 dao.update(treenode); 返回在数据库中的影响行数,比如:在数据库插入了几行、在数据库更新了几行,应该怎么写?

用@Aop(TransAop.READ_COMMITTED)这种方式

抛出异常到方法外,就会触发回滚.

insert/update单个对象的时候,没有多少条的概念嘛,反正就是一条.

批量插入的时候,insert的数量总是已知的

按条件更新的话,update方法会返回int表示更新的数量.

@wendal
3楼中提到的

// 演示aop事务
@IocBean // 需要aop,那当然需要时ioc的bean
public class UserService {
    @Inject Dao dao; // 注入NutDao实例,必须的,哈哈

    @Aop(TransAop.READ_COMMITTED) // TransAop里面定义5个常量,分别对应不同级别的事务拦截器
    public void add(User user) {
        dao.insert(user);
        dao.update(UserToken.class, Chain.make("xxx","xxx"), Cnd.where(.......);
        // 务必注意,必须抛出异常,才能回滚!! 是抛出,不能被catch吃掉.
    }
}    

// 务必注意,必须抛出异常,才能回滚!! 是抛出,不能被catch吃掉.
这个的意思是要try catch db代码块,并throw?
事例代码里面怎么没有try catch?

不是.

// insert/update抛出异常, 会回滚
    @Aop(TransAop.READ_COMMITTED)
    public void add(User user) {
        dao.insert(user);
        dao.update(UserToken.class, Chain.make("xxx","xxx"), Cnd.where(.......);
    }

// insert/update抛出异常,但被catch了, 不会回滚
    @Aop(TransAop.READ_COMMITTED)
    public void add(User user) {
        try {
            dao.insert(user);
            dao.update(UserToken.class, Chain.make("xxx","xxx"), Cnd.where(.......);
       } catch (Exception e) {
              //把异常吃掉了, 没有继续抛出到add方法之外, 不会回滚.
       }
    }
添加回复
请先登陆
回到顶部