首先理解一个事务结束的标准是
显示或隐式
发出 commit 或者 rollback,在发出之后标志另外一个事务的开始。
显示的发出就是敲命令的方式 commit 或者 rollback-
隐式的方式就是比如你 insert 之后,发出了ddl语句(如create、alter等),oracle会隐式commit--下面解释你的问题
1.上面的a事务中没有在****处显式指定rollback,那么如果update出错,-----这个事务会回滚到上一次正确状态吗(是不是可以不要rollback,出错后也会回滚到上一次正确状态)?
--你的事务开始后你分别做了 insert、update、delete 期间你没有做过任何操作,因此这个事务开始了但是没有结束--虽然你的update出错了,但是你并没有显示或隐式的结束事务,因此你在update之后rollback,会将整个事务回滚。
--2.假设执行到update出错了(没有rollback语句),commit会执行吗?
--如果执行,是不是只提交insert(正确)部分?还是insert部分也不会提交?还是commit根本不会执行?
--如果你是在sqlplus中直批量执行的命令(就是写好后直接粘贴到sqlplus窗口),那么commit 会执行。
----执行后标志整个事务的结束,并使得结果永久化,但是因为你的update出错了,因此update并没有起作用。
--如果你是通过plsql程序执行的,那么update出错后,程序直接异常,下面的commit不会被执行。
----在这种情况下,如果你的异常处理里面没有写 commit 或者 rollback的话,事务并未结束,你还需要再-
---发出commit 或 rollback结束事务。
--3.假设我在****处加入了rollback,那么回滚后是继续重新执行事务a直到成功(在事务a中循环),还是回滚到先前正确状态后跳到下一个事务?--这个已经解释的很明白了,rollback了事务就结束了,一个事务的结束标志着另外一个事务的开始。--而事务本身是不会循环的,除非你写了循环逻辑不停的处理这个事务,但是这个事务也不是你认为的重复执行事务a---而是重复的结束旧事务 开始新事务。