- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
面试知识2
事务:*-*
要么全部执行成功,要么撤销不执行。通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。
4个属性(ACID):
原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency):事务结束后系统状态是一致的
隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability):持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
为什么需要事务
事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。
事务的5类问题:
包括3类数据读取问题(脏读、不可重复读和幻读)和2类数据更新问题(第1类丢失更新和第2类丢失更新)。
脏读(Dirty Read):A事务读取B事务尚未提交的数据并在此基础上操作,而B事务执行回滚,那么A读取到的数据就是脏数据。其它的事务(执行单个select语句也算一个事务)可以读取到某个事务更新(包括插入和删除)了但未提交的数据。
时间 转账事务A 取款事务B T1 开始事务 T2 开始事务 T3 查询账户余额为1000元 T4 取出500元余额修改为500元 T5 查询账户余额为500元(脏读) T6 撤销事务余额恢复为1000元 T7 汇入100元把余额修改为600元 T8 提交事务
不可重复读(Unrepeatable Read):事务A重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务B修改过了。
同一个事务中两条一模一样的select语句的执行结果的比较。如果前后执行的结果一样,则是可重复读;如果前后的结果可以不一样,则是不可重复读。不可重复读的模式下首先不会出现脏读要达到可重复读的效果,数据库需要做更多的事情,比如,对读取的数据行加共享锁,并保持到事务结束,以禁止其它事务修改它这样会降低数据库的性能。而隔离级别的串行则比可重复读更严格。一般数据库的的隔离级别只设置到读取已提交这是兼顾了可靠性和性能的结果。
上面还只提到了对命中的数据行加锁,以防止其它事务修改它。但没有提到,如果其它事务增加了符合条件的数据行怎么办?有些数据库对这种情况新定义了两个级别:读取稳定性和游标稳定性。前者不限制新增符合条件的数据行,而后者则阻止新增这样的数据行。
时间 转账事务A 取款事务B T1 ? 开始事务 T2 开始事务 ? T3 ? 查询账户余额为1000元 T4 查询账户余额为1000元 ? T5 ? 取出100元修改余额为900元 T6 ? 提交事务 T7 查询账户余额为900元(不可重复读) ?
幻读(Phantom Read):事务A重新执行一个查询,返回一系列符合查询条件的行,发现其中插入了被事务B提交的行。
时间 统计金额事务A 转账事务B T1 开始事务 T2 开始事务 T3 统计总存款为10000元 T4 新增一个存款账户存入100元 T5 提交事务 T6 再次统计总存款为10100元(幻读)
第1类丢失更新:事务A撤销时,把已经提交的事务B的更新数据覆盖了。
时间 取款事务A 转账事务B T1 开始事务 ? T2 ? 开始事务 T3 查询账户余额为1000元 ? T4 ? 查询账户余额为1000元 T5 ? 汇入100元修改余额为1100元 T6 ? 提交事务 T7 取出100元将余额修改为900元 ? T8 撤销事务 ? T9 余额恢复为1000元(丢失更新) ?
第2类丢失更新:事务A覆盖事务B已经提交的数据,造成事务B所做的操作丢失。
时间 转账事务A 取款事务B T1 开始事务 T2 开始事务 T3 查询账户余额为1000元 T4 查询账户余额为1000元 T5 取出100元将余额修改为900元 T6 提交事务 T7 汇入100元将余额修改为1100元 T8 提交事务 T9 查询账户余额为1100元(丢失更新)
数据并发访问所产生的问题,在有些场景下可能是允许的,但是有些场景下可能就是致命的,数据库通常会通过锁机制来解决数据并发访问问题,按锁定对象不同可以分为表级锁和行级锁;按并发事务锁定关系可以分为共享锁和独占锁,具体的内容大家可以自行查阅资料进行了解。
直接使用锁是非常麻烦的,为此数据库为用户提供了自动锁机制,只要用户
文档评论(0)