一个web项目的某个操作,要在数据库里插入一条记录,但还有其他因素以决定操作是否成功。
我必须先插入数据以获得ID,但如果后面操作失败,则这条数据成为废记录(不应该有的记录),所以还要把它删了。
流程应该是如下哪个?
1.插入数据成功->其他因素失败->删除数据
2.插入数据成功->其他因素失败->事务回滚
要删除的时候已经跳转了2个页面,原来插入操作的数据库连接早已关闭。请问这种情况能用jdbc的rollback()等回滚功能么?
我必须先插入数据以获得ID,但如果后面操作失败,则这条数据成为废记录(不应该有的记录),所以还要把它删了。
流程应该是如下哪个?
1.插入数据成功->其他因素失败->删除数据
2.插入数据成功->其他因素失败->事务回滚
要删除的时候已经跳转了2个页面,原来插入操作的数据库连接早已关闭。请问这种情况能用jdbc的rollback()等回滚功能么?
解决方案 »
- tomcat启动成功 但是无法访问 报400错误
- 在Eclipse下开发Java Swing应用程序,怎样不重新运行Swing Application就能够看到更改之后的效果?
- 请大家帮我看看下面有关字符串输入的问题,谢谢!
- 请问用Socket能否实现在客户端和服务器端的文件传输?
- java.lang.NoSuchMethodError: java.lang.String.replace(...)是什么原因?
- 社会没这么黑暗吧,没分就不给解决??
- Hibernate小结
- 高手教我怎么学
- 请问如何把程序左上角“咖啡”图标换成自己的?谢啦!
- 怎么用javadoc生成注释文档呀能不能举个例子呀!
- 链表 输出类信息错误 请大家帮忙
- cognos 报表材料?
事务回滚应该是数据库在进行插入,删除,更新等操作时运行sql语句错误时应用的。默认情况会回滚到出现错误的这条sql语句之前。
针对你的问题,已经存入数据库,下次操作失败,应该不会自动删除数据。个人感觉第一种肯定没问题的。
需要插入的数据 以及 可否插入状态
至于要不要删除,以及多久删除以此,看楼主需要了。(可以最终画面用完后就删掉对应的记录)
最终画面以此表为基准进行插入
我的建议是:
写一个方法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以后,再进行后面的操作。若后面操作无误,可以进行数据库的操作;
如异常,则直接返回,不进行数据库的操作。
2的那个临时表,保存所有这个业务模块关联的表的数据,在走到最终画面之前,所有相关数据只保存在这个表,
当走到最终画面时,通过判断这个表,决定是否插入,更新到其他表。这样就达到了跨action进行事物处理的效果。3 再推荐一个办法,适合你的这种情况:既然 先插入数据目的只是获得ID,
所以建议为获得ID专门建个sequence,或者表,专门保存id,这个表不参与事物回滚,id取废了就废了,
后面的操作一起处理,就可以使用事物回滚了
得到这个UUID才能进行下面的操作,所以只能先写数据库。如果不写,难保这个UUID不会被其他人重用。还有看到6楼8楼都建议使用临时表,我不明白为啥不直接写在正式表里呢?操作失败了就删掉呗,有啥不一样呢?
楼主你的这种但心是不必要的啊,如果你是明白UUID的产生方式你就不会担心UUID会被其他人使用啊
①如果是uuid的话,不用担心生成的是重复的。。
②不好意思、6楼和8楼都是我。。临时表想说的是:增加一个正式的表,这个表名叫做"临时表"。。
相对于你原来的那些业务表,这个表是一个临时用途的,只是在处理这个业务流程中,为了保持事物一致性才使用。
不像其他表,是为了保存业务数据而使用的