多用户数据库

数据库管理系统允许多人操作。所以如何处理潜在的同步问题等,一定程度上取决于数据库如何处理锁。


锁是数据库用来控制数据资源被并行使用的一种机制。当数据库的一些内容被锁定时,任何企图修改(也可能是读取)这个数据的用户必须等到锁被释放。

两种锁策略:

(1)数据库的写操作必须向服务器申请并获得写锁才能修改数据。读操作必须申请和获得读锁才能查询数据。多用户可以同时读取数据,而一个表(或其他部分)一次只能分配一个写锁,并拒绝读请求直到写锁释放;

缺点:较多并行读请求和写请求时等待时间过长,SQL Server采用这种。

(2)数据库的写操作必须向服务器申请并获得写锁才能修改数据。读操作不需要任何类型的锁就可以查询数据。另一方面,服务器要保证从查询开始到结束读操作看到一个一致的数据视图(即使用户修改,也要看上去相同)。称版本控制。

缺点:修改数据时存在长期运行的查询,则这个方法是有问题的。Oracle采用这种。


MySQL两种方法都包括(取决于用户对存储引擎的选择)。


锁的粒度:

表锁:组织多用户同时修改同一个表的数据

页锁:阻止多用户同时修改某表中同一页的数据(一页通常是一段2~16KB的内存空间)

行锁:阻止多用户同时修改某表中同一行的数据

SQL Server采用三者,Oracle只有行锁,MySQL采用三者(同样取决于用户对存储引擎的选择)。


事务

事务在数据库上是重要的概念。它在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序自动执行。

最简单直观的事务:创建更新或者删除记录等

事务实际上就是对数据库的一个或者多个更改。控制事务以保证数据完整性,并对数据库错误做出处理,对数据库来说非常重要。

实践中,通常会将很多 SQL 查询组合在一起,并将其作为某个事务一部分来执行。

一、事务的4大属性(ACID):

Atomic 原子性:保证任务当中所有的操作都执行完毕,否则,事务会在出现错误的时候终止,并回滚之前所有操作到原始状态;

Consistent一致性:保证事务成功执行,则数据库的状态得到了进行了正确的转变;

Isolated隔离性:保证不同事务相互独立、透明地执行;

Durant 持久性:即使出现系统故障,之前成功执行的事务的结果也会持久存在。


二、事务控制

四个命令:

(1)COMMIT 提交更改

(2)ROLLBACK 回滚更改

(3)SAVEPOINT 在事务内部创建一系列可以ROLLBACK的还原点

(4)SET TRANSACTION  命令事务


COMMIT命令:COMMIT;

COMMIT 命令用于保存事务对数据库所做的更改。
COMMIT 命令会将自上次 COMMIT 命令或者 ROLLBACK 命令执行以来所有的事务都保存到数据库中。


ROLLBACK 命令:ROLLBACK;
ROLLBACK 命令用于撤销尚未保存到数据库中的事务。
ROLLBACK 命令只能撤销自上次 COMMIT 命令或者 ROLLBACK 命令执行以来的事务


SAVEPOINT 命令:SAVEPOINT 是事务中的一个状态点,使得我们可以将事务回滚至特定的点,而不是将整个事务都撤销。

SAVEPOINT SAVEPOINT_NAME; #该命令只能在事务语句之间创建保存点(SAVEPOINT)。ROLLBACK 命令可以用于撤销一系列的事务。

回滚至某一保存点的语法: ROLLBACK TO SAVEPOINT_NAME;


RELEASE SAVEPOINT 命令:
RELEASE SAVEPOINT 命令用于删除先前创建的保存点。

RELEASE SAVEPOINT 的语法如下所示:
RELEASE SAVEPOINT SAVEPOINT_NAME; #保存点一旦被释放,就不能够再用 ROLLBACK 命令来撤销该保存点之后的事务了。


SET TRANSACTION 命令:
SET TRANSACTION 命令可以用来初始化数据库事务,指定随后的事务的各种特征。

例如,可以将某个事务指定为只读或者读写。

SET TRANSACTION [ READ WRITE | READ ONLY ];