数据库MySQL架构:事务处理计算机等级考试
文章作者 100test 发表时间 2009:06:15 06:40:23
来源 100Test.Com百考试题网
编辑特别推荐:
全国计算机等级考试(等考)指定教材
全国计算机等级考试学习视频
全国计算机等级考试网上辅导招生
全国计算机等级考试时间及科目预告
百考试题教育全国计算机等级考试在线测试平台
全国计算机等级考试资料下载
全国计算机等级考试论坛
计算机等级考试四级应用题解析汇总
2009年下半年全国计算机三级考试时间是2009年9月19日至23日。2009年下半年全国计算机三级考试报名时间会在考前两个月开始报名!更多优质资料尽在百考试题论坛 百考试题在线题库。
事务处理
在事务处理之前,你不能知道数据库系统有如此多的高级功能。一个事物就是一组SQL查询。这一组被看做是原子的。也就是一个单独的工作单元。如果数据库引擎可以应用整个组的查询,就执行完毕。但是如果其中一条语句出现问题,整个组的语句都不会被执行。也就是要么全部执行,要么全部不执行。
这部分所讲到的事物很少是针对MySQL的,如果你已经熟悉了ACID事务处理,可以跳过这一部分。
银行的应用是解释为什么需要事务处理的经典案例。假设银行数据有两张表。checking以及savings.从Jane的checking账户转账200到她的saving账户。至少要三步
确定她的checking账户至少有200
从checking账户扣除200
把200添加到她的savings账户中。
整个操作封装为了一个事物。因此其中一个操作失败,整个操作都会回滚。
开始一个事物的语句是START TRANSACTION以及修改成功用COMMIT或者放弃改变用ROLLBACK。因此这个例子的SQL语句如下
Sql代码
START TRANSACTION.
SELECT balance FROM checking WHERE customer_id = 10233276.
UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276.
UPDATE savings SET balance = balance 200.00 WHERE customer_id = 10233276.
COMMIT.
但是单独的事物并不能代表全部。如果在数据库服务器在执行到第四行的时候挂掉呢?用户可能就白白损失了200。以及如果有个处理出现在了3,4行之间,而不会去扣除checking帐户的余额。那么银行就白白给了用户200.
在系统没有通过ACID的测试之前,仅仅有事物还是不够的。ACID的意思是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。这些都是一个好的事务处理系统所要遵循的标准。
原子性(Atomicity):
一个事物必须做为一个单独不可分割的工作单元来运行。因此整个事物要么全部成功要么全部失败。当事物具有原子性的时候,不能一部分的执行。要么全部执行,要么全部失败。
一致性(Consistency):
数据库应该总是从一个一致的状态到另一个。在我们的例子中,一致性要确保程序在3,4行崩溃并不会使checking帐户减少200。因为事物没有提交。数据库没有任何变化。
隔离性(Isolation):
当这个事物没有完成的时候,它的结果对于其他的事物是不可见的。这点确保了在运行完第3行,以及在第4行之前。200还是在checking帐户中。当我们讨论隔离性的时候,我们常常用到不可见(invisible)这个词。
持久性(Durability):
当事物提交,这个事物的改变就被持久化了。意思就是更改被记录了。数据不会丢失了。持久性是个挺模糊的概念。因为它有很多级别。一些持久性策略比其他的有更强的安全性保证。但是绝对没有100%的持久。我们会在以后的章节讨论在MySQL中持久性的意思。
ACID事物保证了银行不会损失钱。这点在业务逻辑上很难或者根本做不到。一个有ACID的数据库服务器已经把各种各样复杂的事情都解决了,使你没有必要自己去确保ACID。
随着锁的颗粒度上升,数据库服务器要在安全性上做更多的工作了。数据库的ACID事物也需要更多的CPU,内存,硬盘空间。我们多次说过MySQL存储引擎架构的优势。你可以决定到底是否使用事物。如果不需要可以选择更好的没有事务支持的存储引擎。在没有事物的时候,你可以使用LOCK TABLES来保护数据。决定权在于你。
隔离级别
隔离要比看上去复杂的多。SQL定义了4种隔离级别。这些规则让更改对事物的内部和外部可见和不可见。低级别的隔离可以高并发低消耗。
(每个存储引擎的隔离级别实现都是不同的,如果你过去经常使用其他数据库产品,存储引擎不一定符合你的需求,你应该看手册决定使用哪个存储引擎。)
未提交读(READ UNCOMMITTED)
在这个级别中,事物可以看到未提交事物的结果。这个级别有很多问题会发生,除非你真的真的明白你在做什么以及有足够的理由去做。这级别在实践中很少使用。因为性能相对于其他级别也没什么优势。读取未提交的数据,也叫脏读(dirty read)
已提交读(READ COMMITTED)
有许多数据库系统默认的隔离级别都是已提交读(MySQL并不是)。它满足了早期使用的隔离简单定义:一个事物可以看到事物提交后的改变。这种改变在提交之前对于其他事物是不可见的。这级别也经常叫做不可重复读(nonrepeatable read)。意思就是你运行同一语句两次,可以看到不同的数据。