core/src/main/java/com/orientechnologies/orient/core/db/document/ODatabaseDocumentAbstract.java
@Override
  public <RET extends ORecord> RET save(final ORecord iRecord) {
    return (RET) save(iRecord, null, OPERATION_MODE.SYNCHRONOUS, false, null, null);
  }
@Override
  public <RET extends ORecord> RET save(final ORecord iRecord) {
    return (RET) save(iRecord, null, OPERATION_MODE.SYNCHRONOUS, false, null, null);
  }
Saves a document to the database. Behavior depends by the current running transaction if any. If no transaction is running then
changes apply immediately. If an Optimistic transaction is running then the record will be changed at commit time. The current
transaction will continue to see the record as modified, while others not. If a Pessimistic transaction is running, then an
exclusive lock is acquired against the record. Current transaction will continue to see the record as modified, while others
cannot access to it since it's locked.
<p>
If MVCC is enabled and the version of the document is different by the version stored in the database, then a {@link
OConcurrentModificationException} exception is thrown.Before to save the document it must be valid following the constraints
declared in the schema if any (can work also in schema-less mode). To validate the document the {@link ODocument#validate()} is
called.

@param iRecord Record to save.

@return The Database instance itself giving a "fluent interface". Useful to call multiple methods in chain.

@throws OConcurrentModificationException if the version of the document is different by the version contained in the database.
@throws OValidationException             if the document breaks some validation constraints defined in the schema
@see #setMVCC(boolean), {@link #isMVCC()}