多用户数据库:数据库系统可以允许多个用户查询或者修改数据。如果每个人都只执行查询操作,则数据库服务器可以正常工作。如果有多个用户同时添加或者修改数据,那么服务器就需要多更多的记录。
锁
锁是数据库服务器用来控制数据资源被并行使用的一种机制。
当数据库的一些内容被锁定时,任何打算修改这个数据的用户必须等到锁被释放。
- 数据库的写操作必须向服务器申请并获得写锁才能修改数据,而读操作必须申请和获得读锁才能查询数据。多用户可以同时读取数据,而一个表一次只能分批一个写锁,并且拒绝读请求直至写锁释放。
- 数据库的写操作必须向服务器申请并获得写锁才能修改数据,而读操作不需要任何类型的锁就可以查询数据。另一方面,服务器要保证从查询开始到结束读操作看到一个一致的数据视图。
第一种在有较多的并行读请求和写请求时等待时间过长。第二种在修改数据时存在长期运行的查询也会有问题。
锁的粒度
- 表锁:阻止多用户同时修改同一个表的数据。
- 页锁:阻止多用户同时修改某表中同一页(一页通常是一段2~16KB的内存空间)的数据。
- 行锁:阻止多用户同时修改某表中同一行的数据。
表锁可以使用较少的记录就可以锁定整个表,但用户增多时它会迅速产生不可接受的等待时间。行锁需要更多的记录,但是只要各个用户的兴趣在不同的行,就可以允许多人修改同一个表。
事务
事务是一种将多条SQL语句聚集到一起,并且能够实现要么所有语句都执行,要么一个也不执行(这个属性称为原子属性)。
从储蓄账户划转500到支票账户。如果成功从储蓄卡成功支取却没有存入支票账户,则进行rollback命令插销服务器自事务开始时的所有变化。否则,如果事情成功,则发出commit命令结束事务。
当程序完成了事务,并发出了commit命令,还没有将表话持久化到永久存储区,服务器就宕机了,那么服务器重新启动时数据库必须重新应用事务的变化(这种属性称为持久性)。
网友评论