VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1318|回复: 12

原来一切正常,但是自从在SQL数据库里加了一个触发器后,就报错了,搞不懂???

[复制链接]

1

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-2-20 12:00:03 | 显示全部楼层 |阅读模式
log4j:WARN No appenders could be found for logger (org.jboss.util.NestedThrowable).

log4j:WARN Please initialize the log4j system properly.

org.jboss.tm.JBossTransactionRolledbackException: null; nested exception is:
        org.jboss.tm.JBossRollbackException: Unable to commit, tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=lqgscp/15, BranchQual=, localId=15] status=STATUS_NO_TRANSACTION; - nested throwable: (javax.ejb.EJBException: Update failed. Expected one affected row: rowsAffected=0, id=dyxx.TransinfoPK@3a2b7dd); - nested throwable: (org.jboss.tm.JBossRollbackException: Unable to commit, tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=lqgscp/15, BranchQual=, localId=15] status=STATUS_NO_TRANSACTION; - nested throwable: (javax.ejb.EJBException: Update failed. Expected one affected row: rowsAffected=0, id=dyxx.TransinfoPK@3a2b7dd))

        at org.jboss.ejb.plugins.TxInterceptorCMT.throwJBossException(TxInterceptorCMT.java:554)

        at org.jboss.ejb.plugins.TxInterceptorCMT.endTransaction(TxInterceptorCMT.java:491)

        at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:346)

        at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:166)

        at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:139)

        at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:192)

        at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:122)

        at org.jboss.ejb.SessionContainer.internalInvoke(SessionContainer.java:624)

        at org.jboss.ejb.Container.invoke(Container.java:873)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

        at java.lang.reflect.Method.invoke(Method.java:585)

        at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:141)

        at org.jboss.mx.server.Invocation.dispatch(Invocation.java:80)

        at org.jboss.mx.server.Invocation.invoke(Invocation.java:72)

        at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:249)

        at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:644)

        at org.jboss.invocation.jrmp.server.JRMPInvoker$MBeanServerAction.invoke(JRMPInvoker.java:805)

        at org.jboss.invocation.jrmp.server.JRMPInvoker.invoke(JRMPInvoker.java:406)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

        at java.lang.reflect.Method.invoke(Method.java:585)

        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294)

        at sun.rmi.transport.Transport$1.run(Transport.java:153)

        at java.security.AccessController.doPrivileged(Native Method)

        at sun.rmi.transport.Transport.serviceCall(Transport.java:149)

        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)

        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)

        at java.lang.Thread.run(Thread.java:595)

Caused by: org.jboss.tm.JBossRollbackException: Unable to commit, tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=lqgscp/15, BranchQual=, localId=15] status=STATUS_NO_TRANSACTION; - nested throwable: (javax.ejb.EJBException: Update failed. Expected one affected row: rowsAffected=0, id=dyxx.TransinfoPK@3a2b7dd)

        at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:344)

        at org.jboss.ejb.plugins.TxInterceptorCMT.endTransaction(TxInterceptorCMT.java:486)

        ... 29 more

Caused by: javax.ejb.EJBException: Update failed. Expected one affected row: rowsAffected=0, id=dyxx.TransinfoPK@3a2b7dd

        at org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreEntityCommand.execute(JDBCStoreEntityCommand.java:155)

        at org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.storeEntity(JDBCStoreManager.java:651)

        at org.jboss.ejb.plugins.CMPPersistenceManager.storeEntity(CMPPersistenceManager.java:413)

        at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.storeEntity(CachedConnectionInterceptor.java:390)

        at org.jboss.ejb.EntityContainer.storeEntity(EntityContainer.java:743)

        at org.jboss.ejb.GlobalTxEntityMap$2.synchronize(GlobalTxEntityMap.java:134)

        at org.jboss.ejb.GlobalTxEntityMap$GlobalTxSynchronization.synchronize(GlobalTxEntityMap.java:253)

        at org.jboss.ejb.GlobalTxEntityMap$GlobalTxSynchronization.beforeCompletion(GlobalTxEntityMap.java:302)

        at org.jboss.tm.TransactionImpl.doBeforeCompletion(TransactionImpl.java:1384)

        at org.jboss.tm.TransactionImpl.beforePrepare(TransactionImpl.java:1076)

        at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:296)

        ... 30 more


我在查询分析器里面测过那个触发器,一切正常,不知道怎么一到EJB里面就出问题呢?看了些资料,不知所云。还望这里的高手给解答一下啊。
回复

使用道具 举报

0

主题

39

帖子

23.00

积分

新手上路

Rank: 1

积分
23.00
发表于 2020-4-28 12:15:01 | 显示全部楼层
把你在EJB里update的SQL操作拿到外面去运行看是否有报错。
回复

使用道具 举报

0

主题

18

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-4-30 03:15:01 | 显示全部楼层
同意楼上
回复

使用道具 举报

1

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-5-28 19:00:01 | 显示全部楼层
这是EJB里的那个修改函数:  
public void updateTransinfo2(String substaid, String lineid, String transid,
                               BigDecimal voltagein, Timestamp usedate,
                               String transname, String copyerid,
                               Integer transtypeid, Integer usetype,
                               Integer transcapa, Integer booknum,
                               String transaddr, String producecompany,
                               String producecode, Timestamp producedate,
                               Integer nousedays, Integer compoint,
                               BigDecimal rating) {

    TransinfoPK pk = new TransinfoPK(substaid, lineid, transid);
    try {
      TransinfoRemote ejb = Transinfohome.findByPrimaryKey(pk);

      ejb.setVoltagein(voltagein);
      ejb.setUsedate(usedate);

      ejb.setTransname(transname);
      ejb.setCopyerid(copyerid);
      ejb.setTranstypeid(transtypeid);
      ejb.setUsetype(usetype);

      ejb.setTranscapa(transcapa);

      ejb.setTransaddr(transaddr);
      ejb.setProducecompany(producecompany);
      ejb.setProducecode(producecode);

      ejb.setProducedate(producedate);
      ejb.setNousedays(nousedays);
      ejb.setCompoint(compoint);
      ejb.setRating(rating);
      ejb.setBooknum(booknum);

    }
    catch (RemoteException ex) {
    }
    catch (FinderException ex) {
    }
  }

这是我在JBUILDER里生成的测试端:
  public static void main(String[] args) {
    dyxxSessTestClient1 client = new dyxxSessTestClient1();
    dyxxSess test=client.create();

    String substaid="01";   //变电站编号
    String lineid="3030";     //线路编号
    String transid="005";    //变压器编号
    BigDecimal  voltagein=new BigDecimal("36.1");  //输入端电压
    Timestamp usedate = Timestamp.valueOf("2015-11-11 15:14:18.999999911");//投运日期

    String transname="33";     //变压器名称
    String copyerid="01";      //抄表员编号
    String charcomid="02";        //供电所编号
    Integer transtypeid=Integer.valueOf(1);  //变压器类型
    Integer usetype=Integer.valueOf(0);      //专用公用标志

    Integer transcapa=Integer.valueOf(33);  //固定容量
    Integer booknum=Integer.valueOf(33);    //表本号
    String transaddr="33";      //安装地址
    String producecompany="33"; //生产厂家
    String producecode="33";    //出厂编号
    Timestamp producedate = Timestamp.valueOf("2015-08-08 15:14:18.999999911"); //出厂日期
    Integer nousedays=Integer.valueOf(33);      //运行天数
    Integer compoint=Integer.valueOf(0);
        BigDecimal rating=new BigDecimal("0.5555");
//        BigDecimal rating=null;
        try {
          test.updateTransinfo2(
              substaid, lineid, transid,
              voltagein, usedate,
              transname, copyerid, transtypeid,
              usetype, transcapa,booknum
              , transaddr,
              producecompany, producecode,
              producedate, nousedays, compoint, rating
              );
        }
        catch (Exception ex) {
          ex.printStackTrace();
        }

  }

当我在EJB 的public void updateTransinfo2(..){..}里 把    ejb.setBooknum(booknum);这句话注释掉以后,运行整个测试端没有问题,其余的字段也能够修改。如果有这句话,在测试端就会报上面的错误。

update transinfo set booknum=999 where substaid='01' and lineid='3030' and transid='001'
这是我在查询分析器里单独更改那个有触发器的字段,触发器是可以正常工作的

还望高手赐教
回复

使用道具 举报

0

主题

3

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-23 14:30:01 | 显示全部楼层

去掉触发器就不报错了吗?确定?

若是: 在触发器最后加上commit tran试试!
回复

使用道具 举报

0

主题

3

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-23 14:45:01 | 显示全部楼层
当然触发器前要加:
begin tran
回复

使用道具 举报

1

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-7-28 18:30:01 | 显示全部楼层
下面是那个触发器,
单独在查询分析器里执行(就是更改那个有触发器的字段),触发器完全起作用,当我在EJB里,把那个与触发器有关系的语句(ejb.setBooknum(booknum);)注释掉,整个EJB 的程序是没有问题的


SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO


/*创建修改变压器信息触发器*/
ALTER   trigger T_update_trans
on transinfo
for update
as
--停运变压器,由触发器维护停运信息表
begin
  
  --修改变压器表本号,由触发器维护用户的表本号
  if update(booknum)
  begin
        begin tran trans1
        
          update userinfo set booknum = b.booknum
          from userinfo a,inserted b
          where a.substaid = b.substaid and a.lineid = b.lineid and a.transid = b.transid
         
          commit tran trans1
  end
end


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-30 19:45:02 | 显示全部楼层
触发器是否修改了其他程序没有权根的表格
回复

使用道具 举报

1

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-7-31 16:00:01 | 显示全部楼层
我感觉好像与EJB 有关。
JBossTransactionRolledbackException  这个异常可能是关键,我搜过关于这个异常,但是没有看懂相关的文章
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-12 03:00:01 | 显示全部楼层
update userinfo set userinfo.booknum = b.booknum
  from userinfo a,inserted b
  where a.substaid = b.substaid and a.lineid = b.lineid and a.transid = b.transid
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表