一个web项目的某个操作,要在数据库里插入一条记录,但还有其他因素以决定操作是否成功。
我必须先插入数据以获得ID,但如果后面操作失败,则这条数据成为废记录(不应该有的记录),所以还要把它删了。
流程应该是如下哪个?
1.插入数据成功->其他因素失败->删除数据
2.插入数据成功->其他因素失败->事务回滚
要删除的时候已经跳转了2个页面,原来插入操作的数据库连接早已关闭。请问这种情况能用jdbc的rollback()等回滚功能么?

解决方案 »

  1.   

    采用第一种吧
    事务回滚应该是数据库在进行插入,删除,更新等操作时运行sql语句错误时应用的。默认情况会回滚到出现错误的这条sql语句之前。
    针对你的问题,已经存入数据库,下次操作失败,应该不会自动删除数据。个人感觉第一种肯定没问题的。
      

  2.   

    个人认为事物只能以action为单位,跨多个action还用事物有些不妥,推荐:1少量数据,简单业务,可以先保存在会话当中啊2大量数据,复杂业务,专门建个临时表,保存 
    需要插入的数据 以及 可否插入状态
    至于要不要删除,以及多久删除以此,看楼主需要了。(可以最终画面用完后就删掉对应的记录)
    最终画面以此表为基准进行插入
      

  3.   

    如果仅仅是为了获取ID而在之前插入数据的话,有点不合适。
    我的建议是:
    写一个方法JdbcUtil.getNextId(),自动获取下一条记录的ID,比如:
    若ID是int型,可以获取最大的ID,然后加1即为下一条数据的ID。 public class JdbcUtil{
      ......
      public static int getNextId(){
        int nextId=-1;
        ......
        String sql="select max(id) from my_table";
        ......
        if(rs.next()){
           nextId=rs.getInt(1)+1;//获取最大之后加1
           ......
        }
        ......
      }}用该方法获取了ID以后,再进行后面的操作。若后面操作无误,可以进行数据库的操作;
    如异常,则直接返回,不进行数据库的操作。
      

  4.   

    6楼的2说的不够清楚,
    2的那个临时表,保存所有这个业务模块关联的表的数据,在走到最终画面之前,所有相关数据只保存在这个表
    当走到最终画面时,通过判断这个表,决定是否插入,更新到其他表。这样就达到了跨action进行事物处理的效果。3 再推荐一个办法,适合你的这种情况:既然 先插入数据目的只是获得ID,
    所以建议为获得ID专门建个sequence,或者表,专门保存id,这个表不参与事物回滚,id取废了就废了,
    后面的操作一起处理,就可以使用事物回滚了
      

  5.   

    关于Id获取,我说的不够清楚,我是要先在数据库插入记录,并获得它的唯一性ID(UUID,128位)。
    得到这个UUID才能进行下面的操作,所以只能先写数据库。如果不写,难保这个UUID不会被其他人重用。还有看到6楼8楼都建议使用临时表,我不明白为啥不直接写在正式表里呢?操作失败了就删掉呗,有啥不一样呢?
      

  6.   

    采用第一种吧 
    楼主你的这种但心是不必要的啊,如果你是明白UUID的产生方式你就不会担心UUID会被其他人使用啊
      

  7.   


    ①如果是uuid的话,不用担心生成的是重复的。。
    ②不好意思、6楼和8楼都是我。。临时表想说的是:增加一个正式的表,这个表名叫做"临时表"。。
    相对于你原来的那些业务表,这个表是一个临时用途的,只是在处理这个业务流程中,为了保持事物一致性才使用。
    不像其他表,是为了保存业务数据而使用的