Besides the ability of store and retrieve information, most leading databases provide additional features to aid administrators and programmers in working with databases. The following are some of the more prominent additional features in databases.
Mistakes commonly happen when data is inserted into a database table; or when existing data is modified. For example, errors can occur because of human errors in typing in the data.
A good database allow designers to specify column constraints so that the values that a column can accept are constrained to certain limitations. For example, state codes in America are uppercase 2-letter abbreviations; age cannot be a negative number; product code values need to be constrained to be looked up from a product table.
When an SQL query has been successfully executed, the database engine returns a result set consisting 1 or more rows of data. Most leading databases provide cursors to aid programmers by providing a logical mechanism to access the results in such a result set. This logical mechanism is called a cursor.
Cursors are pointers the the current row within a returned result set. Cursors are scrollable in the sense that they can move forward and backwards within the returned result set as instructed by a program. The program typically issues an SQL query and then point the cursor to the start of the returned result set. The cursor can then be moved forward or backward by the program within the returned result set. The program can access the data in the row that the cursor points to.
Stored procedures are a collection of SQL statements that are optimized; ready to execute; and are stored in the database engine. With stored procedures, such a collection of SQL statements can be executed all at one go with a single command. The initiator simply initiates the execution command and waits for a returned result.
Without such a feature, SQL statements would need to be sent one by one by a program or a human through a client interface. Each SQL statement has to be sent individually to the database engine which will return a result for each individual SQL statement. The additional overhead as compared to using stored procedures is that the program or human will have to wait for and process each individual return before sending the next SQL statement to the database engine. Also, instead of being already optimized and ready to execute, each SQL statement that the database engine receives will have to be prepared and 'compiled' before it can be understood by the database engine.
Most databases cater for multi-user access through the use of locking mechanisms. A lock is a hold or a reserve that is placed on a row of data. This lock prevents other users from accessing the row until the lock is released.
Whenever a user tries to access or update a particular row of data that is currently being accessed or updated by another user, the 'late' user will have to wait until the first user has completed his task before the 'late' user can begin working on the row of data. This mechanism ensures the integrity of data in a database and prevents concurrency problems.
However, in some cases where users issue long and complicated queries to the database engine, this locking mechanism causes dead-locks which can potentially crash the database engine. Dead-lock occurs in situations when 2 or more users are waiting for resources that are being held up by each other. For example, user A has issued a complicated SQL statement that has locked rows 1 and 2. User A's query now needs to access row 3 before the entire transaction can be completed and all locks can be released. However, user B has also issued a complicated SQL statement that has locked rows 3 and 4. User B's query is now waiting to access row 2 which has been locked by user A's query. In such a situation, both user A's and user B's queries will continue waiting until an administrator kills both processes and releases the dead-lock. Dead-locks put a heavy drain on computing resources and can potentially bring down the database engine.