多用户数据库
数据库管理系统允许多人操作。所以如何处理潜在的同步问题等,一定程度上取决于数据库如何处理锁。
锁
锁是数据库用来控制数据资源被并行使用的一种机制。当数据库的一些内容被锁定时,任何企图修改(也可能是读取)这个数据的用户必须等到锁被释放。
两种锁策略:
(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 ];