我正在使用Oracle和AutoCommit ON模式(使用JDBC的Java应用程序)。
当我将多个DML语句作为单个事务执行时,我认为我可以这样做:
-Threaded
然而,似乎每当我最终执行func addSkipBackupAttributeToItemAtURL(URL: NSURL) -> Bool{
let fileManager = NSFileManager.defaultManager()
assert(fileManager.fileExistsAtPath(URL.absoluteString))
var error:NSError?
let success:Bool = try? URL.setResourceValue(NSNumber(bool: true),forKey: NSURLIsExcludedFromBackupKey)
if !success {
print("Error excluding \(URL.lastPathComponent) from backup \(error)")
} else {
print("File at path \(URL) was succesfully updated")
}
return success
}
时,行都会在上面的语句中给出新值。
因此,即使set transaction read write
update user_tbl set name='mark' where email='m@xyz.com'
update user_tbl set name='ken' where email='k@xyz.com'
--if other things are successful, then:
commit
-- else:
--rollback
在开头执行,是否有可能在AutoCommit ON模式下执行rollback
语句?
答案 0 :(得分:0)
这在文件中清楚地解释了:
http://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html
http://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#setAutoCommit(boolean)
注意:配置Connection时,JDBC应用程序应使用相应的Connection方法,例如setAutoCommit或setTransactionIsolation。 当有可用的JDBC方法时,应用程序不应直接调用SQL命令来更改连接的配置。默认情况下,Connection对象处于自动提交模式,这意味着它在执行每个语句后自动提交更改。如果已禁用自动提交模式,则必须显式调用方法commit才能提交更改;否则,数据库更改将不会保存。
<强>的setAutoCommit 强>
void setAutoCommit(boolean autoCommit) 抛出SQLException
将此连接的自动提交模式设置为给定状态。 如果连接处于自动提交模式,则其所有SQL语句将作为单个事务执行并提交。否则,其SQL语句将分组为通过调用方法终止的事务提交或方法回滚。默认情况下,新连接处于自动提交模式。 语句完成时发生提交。语句完成的时间取决于SQL语句的类型:对于DML语句,例如Insert,Update或Delete,以及DDL语句,语句在完成执行后立即完成。 对于Select语句,关闭关联结果集时语句完成。 对于CallableStatement对象或返回多个结果的语句,当关闭所有关联的结果集并且已检索到所有更新计数和输出参数时,语句将完成。 注意:如果在事务期间调用此方法并且更改了自动提交模式,则提交事务。如果调用setAutoCommit并且未更改自动提交模式,则调用是无操作。
以上意思是,您的代码在自动提交模式下运行,相当于:
set transaction read write;
commit; -- invoked by JDBC autocommit
update user_tbl set name='mark' where email='m@xyz.com';
commit; -- invoked by JDBC autocommit
update user_tbl set name='ken' where email='k@xyz.com';
commit; -- invoked by JDBC autocommit
--if other things are successful, then:
commit;
commit; -- invoked by JDBC autocommit