起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: zsj5237

[结贴] 如何在流程流转结束步骤,调用自定义action

[复制链接]

67

主题

279

帖子

434

积分

中级会员

Rank: 3Rank: 3

积分
434
QQ
 楼主| 发表于 2014-11-19 08:51:29 | 显示全部楼层
jishuang 发表于 2014-11-18 10:35
// 异常情况
                                        int abc = 2 / 0;
                               ...

事务,我讲的是事务,报错了,应该rollback,现在数据入库了,你明白我说什么?
回复 支持 反对

使用道具 举报

396

主题

2433

帖子

4863

积分

论坛元老

Rank: 8Rank: 8

积分
4863
QQ
发表于 2014-11-19 08:58:42 | 显示全部楼层
手动回滚参考一下:
  1.                 } catch (NamingException e) {
  2.                         e.printStackTrace();
  3.                         return 1;
  4.                 } catch (SQLException e) {
  5.                         //手工回滚事务或者抛出异常都可以
  6.                         ContextHelper.getTransaction().rollback();
  7.                         e.printStackTrace();
  8.                         return 1;
  9.                 } finally {
  10.                         try {
  11.                                 if (ps != null) {
  12.                                         ps.close();
  13.                                 }
  14.                                 if(con != null) {
  15.                                         con.close();
  16.                                 }
  17.                         } catch (SQLException e) {
  18.                                 System.out.println("##close.SQLException");
  19.                         }

  20.                 }
复制代码
QQ67886387
回复 支持 反对

使用道具 举报

67

主题

279

帖子

434

积分

中级会员

Rank: 3Rank: 3

积分
434
QQ
 楼主| 发表于 2014-11-19 09:57:32 | 显示全部楼层
67886387 发表于 2014-11-19 08:58
手动回滚参考一下:

try {
                                //tx.rollback();
                                ContextHelper.getTransaction().rollback();
                                System.out.println("rollback ok?");
                        } catch (SQLException ex) {
                                System.out.println("rollback exception"+ex.getMessage());
                        }

这句总会报错:
rollback exception回滚事务出错
回复 支持 反对

使用道具 举报

发表于 2014-11-19 10:02:30 | 显示全部楼层
回滚参考
http://bbs.justep.com/thread-33592-1-1.html
自己控制事务
回复 支持 反对

使用道具 举报

396

主题

2433

帖子

4863

积分

论坛元老

Rank: 8Rank: 8

积分
4863
QQ
发表于 2014-11-19 10:10:28 | 显示全部楼层
zsj5237 发表于 2014-11-19 09:57
try {
                                //tx.rollback();
                                ContextHelper.getTransaction().rollback();

  // 创建连接,放到方法外,参考一下java.sql.Connection conn = null;
com.justep.system.data.Transaction tx = null;
CallableStatement proc = null;

  1. public class GetQsMdb {
  2.         Connection conn = null;
  3.         PreparedStatement ps = null;
  4.         CallableStatement proc = null;

  5.         public void getSql(String lujin) throws FileNotFoundException, SQLException, IOException {
  6.                 // TODO Auto-generated method stub
  7.                 try {
  8.                         // 取得数据库连接
  9.                         conn = com.justep.model.ModelUtils.getConnectionInTransaction("/LandManagerSys/LandInfoMgr/data");
  10.                         proc = conn.prepareCall("{ call HR_Interface_Generate1(?,?,?,?) }");
  11.                         
  12.                 } catch (NamingException e) {
  13.                         e.printStackTrace();
  14.                 } catch (SQLException e) {
  15.                         //手工回滚事务或者抛出异常都可以
  16.                         ContextHelper.getTransaction().rollback();
  17.                         e.printStackTrace();
  18.                 } finally {
  19.                         try {
  20.                                 if (ps != null) {
  21.                                         ps.close();
  22.                                 }
  23.                                 if(conn != null) {
  24.                                         conn.close();
  25.                                 }
  26.                         } catch (SQLException e) {
  27.                                 System.out.println("##close.SQLException");
  28.                         }

  29.                 }
  30.         }

  31. }
复制代码




QQ67886387
回复 支持 反对

使用道具 举报

67

主题

279

帖子

434

积分

中级会员

Rank: 3Rank: 3

积分
434
QQ
 楼主| 发表于 2014-11-19 10:35:14 | 显示全部楼层
67886387 发表于 2014-11-19 10:10
// 创建连接,放到方法外,参考一下java.sql.Connection conn = null;
com.justep.system.data.Transact ...

放外面一样,rollback exception回滚事务出错
回复 支持 反对

使用道具 举报

91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
35942
发表于 2014-11-19 14:56:17 | 显示全部楼层
action中如下,测试没问题
  1. public static void Transaction(){
  2.                 System.out.println("##自己控制事务");
  3.                 java.sql.Connection conn = null;
  4.                 java.sql.PreparedStatement pstmt = null;
  5.                 com.justep.system.data.Transaction tx = null;
  6.                 try {
  7.                         // 取得数据库连接
  8.                         tx = new com.justep.system.data.Transaction();
  9.                         conn = tx.getConnection("/appdemo/test/data");
  10.                         tx.begin();
  11.                         // 更新一个字段
  12.                         pstmt = conn.prepareStatement("update AP_RQ set fName = 'Transaction' where fID = '183C666F7FD94622B79D5D985064731C'");
  13.                         pstmt.execute();
  14.                         // 更新另一个字段
  15.                         pstmt = conn.prepareStatement("update AP_RQ set fCode = '审批中' where fID = '183C666F7FD94622B79D5D985064731C'");
  16.                         int abc = 2 / 0;
  17.                         pstmt.execute();
  18.                         tx.commit();
  19.                 } catch (NamingException e) {
  20.                         throw new RuntimeException(e);
  21.                 } catch (SQLException e) {
  22.                         try {
  23.                                         tx.rollback();
  24.                                 } catch (SQLException e1) {
  25.                                         // TODO Auto-generated catch block
  26.                                         e1.printStackTrace();
  27.                                 }
  28.                         throw new RuntimeException(e);
  29.                 } finally {
  30.                         try {
  31.                                 if (pstmt != null) {
  32.                                         pstmt.close();
  33.                                 }
  34.                                 if (conn != null) {
  35.                                         conn.close();
  36.                                 }
  37.                         } catch (SQLException e) {
  38.                                 System.out.println("##close.SQLException");
  39.                         }
  40.                 }

  41.         }
复制代码
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

67

主题

279

帖子

434

积分

中级会员

Rank: 3Rank: 3

积分
434
QQ
 楼主| 发表于 2014-11-19 15:38:45 | 显示全部楼层
jishuang 发表于 2014-11-19 14:56
action中如下,测试没问题

private static void synchronousHr(Iterator<Row> rows) {
                // 创建连接
                java.sql.Connection conn = null;
                com.justep.system.data.Transaction tx = null;
                CallableStatement proc = null;
                try {
                        // 取得数据库连接
                        tx = new com.justep.system.data.Transaction();
                        //conn = ModelUtils.getConnectionInTransaction("/dngt/hr/data");
                        conn = tx.getConnection("/dngt/hr/data");
                        tx.begin();
                        // 存储过程对象
                        proc = conn.prepareCall("{ call HR_Interface_Generate1(?,?,?,?) }");
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
                        executeProcedure(proc, "123", sdf.format(new Date()), getFirstDayType(new Date()), "321");
                        int abc = 2/0;
                        executeProcedure(proc, "456", sdf.format(new Date()), getFirstDayType(new Date()), "654");
                       
                        tx.commit();
                } catch (Exception e) {
                        try {
                                tx.rollback();
                                System.out.println("execute exception:"+e.getMessage());
                        } catch (SQLException ex) {
                                System.out.println("rollback exception:"+ex.getMessage());
                        }
                } finally {
                        try {
                                if (proc != null) {
                                        proc.close();
                                }
                                if(conn != null){
                                        conn.close();
                                }
                        } catch (Exception e) {
                                e.printStackTrace();
                                System.out.println("close exception" + e.getMessage());
                        }
                }
        }

        private static void executeProcedure(CallableStatement proc, String empNo, String date, String type, String no) throws Exception {
                //赋值参数
                proc.setString(1, empNo); //@EmpNo 工号
                proc.setString(2, date); //@Date 请假时间
                proc.setString(3, type); //@Type 请假半天类型
                proc.setString(4, no); //@No 请假单号
                proc.execute();
        }

一样写法,我执行,俩条插库操作,有一条能入库,第二条操作异常,不入库,事务没有回滚。
我不知道,你的update,是否真正检测过值变化,我这里是清楚的看到,库记录数的变化。

或者麻烦使用我的俩个方法检测。存储过程如下:
create procedure HR_Interface_Generate1
(
@EmpNo        varchar(255) ,
@Date datetime,
@Type varchar(255) ,
@No varchar(255)
) as
begin
  insert into HR_Leave
    (EmpNo, Date, Type, No)
  values
    (@EmpNo, @Date, @Type, @No);
  commit;
end;


回复 支持 反对

使用道具 举报

91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
35942
发表于 2014-11-19 16:42:12 | 显示全部楼层
你好楼主,这个问题需要我在本地环境进行问题重现,所以会花费较长时间,请你耐心等待,我完成后会第一时间反馈结果,谢谢!
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
35942
发表于 2014-11-20 11:03:06 | 显示全部楼层
把存储过程中的commit去掉
commit.png
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-5-19 23:40 , Processed in 0.109441 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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