"There should never be more than one reason for a class to change." In other words, every class should have only one responsibility.
Software component should be closed for modification, but open for extension. This means that new software getting added to the software component, should not have to modify existing code.
Objects should be replaceable with their subtypes without affecting the correctness of the program.
Interfaces should only require the consumer to implement what they really need.
High level functionality should not know about implementation details of low level implementations (For example how is the data stored in the database). It needs to be abstracted via Interfaces
A transaction is a single unit and either completely succeeds or completely fails
A transaction can change a database only from one valid state to another valid state.
Transactions are isolated from each other. Even if they arrive concurrently they are treated as if they arrived sequentially
If a transaction is a committed it will stay committed even if the database system fails in case of a power outage or crash
Every client views the same data. Every node in distributed cluster recieves same data.
During node failure time, every node must respond in a reasonable amount of time.
Gurantees partition tolerance can recover from partitions once the partition heals.