Mysql事务和锁概要.ppt

  1. 1、本文档共31页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Mysql事务和锁概要

锁之间的兼容关系 一致性非锁定读加锁 基于MVCC机制, select操作是在读取undo中历史数据, 因为历史数据不需要修改, 所以不需要加任何锁. Locking reads 一致性锁定读, 不会使用undo日志, 会直接对当前记录加锁. select for update 会加x锁, select lock in share mode 回家s锁. 其他的都相同. 提问 什么场景下, 需要使用select for update 而不是select in share mode? 加锁信息解读 insert加锁 Insert不会自己加锁,而在插入之后,如果还没有提交,此时正好有其它事务做更新或者删除操作了,则这个操作会为这个插入操作加一把锁,然后自己再加一把锁 Insert acts as if locked by itself. Update by primary key 如果要更新的记录存在, 加一把 record lock. 如果记录不存在, 加gap lock. 如果整张表是空的, gap lock锁住(-INF, INF) Update by unique key 如果要更新的记录存在, 在唯一键上有一把行锁, 在主键上有一把行锁 如果记录不存在, 加gap lock. * A: 原子性, 事务执行结果只有两个状态, 要么执行成功, 提交, 要么直接回滚. C: 一致性, 事务将数据库从一种状态转变为下一周一致的状态. 数据库的完整性约束不会被破坏. I: 隔离性, 每个读写事务的对象对其他事务的操作对象相互隔离. 该事物提交前对其他事务不可见, 通常通过锁实现. D: 事务提交后, 结果是永久性的. 及时发生宕机, 数据库也能将数据恢复. 需要强调的一点是, 隔离级别是相对于读来说的. * * 规则是一方面, 但是各个厂商都可以根据自己的情况, 定制化自己的实现. 类似情况还包括, 各种浏览器对html标准的支持, TCP/IP模型()和ISO模型. 应用层, 主机到主机层(TCP)(又称传输层) , 网络层(IP)(又称互联层), 网络接口层(又称链路层) mysql 下面, 如何设置隔离级别: SELECT @@global.tx_isolation; SELECT @@session.tx_isolation; SELECT @@tx_isolation; SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE} * * RR和RC下面, select 对于mvcc使用是不一样的. RR下面, select 一直使用当前事务最开始读到的那个版本, 而在RC下面, 每次select , 为了督导最新提交, 都会去读最新的版本. 做一下实现 题外话, ConcurrentHashMap, CopyOnWriteArrayList 这两个数据结构, 都是类似的设计逻辑, 做到了弱一致性. * 实验: transaction1: set session tx_isolation = repeatable-read; //第二个实验设置成read-committed. begin; select @@session.tx_isolation; select * from test_lock where id = 1; .. commit; transaction2: begin; update test_lock set name_index = fangxue where id = 1; commit; * 锁住primary key 就是锁住了所有字段, 锁住某个secondary index, 就是锁住了那个字段和primary key. * 这里的X锁和S锁, 都是指表锁. 表级锁和行级锁之间, 是不存在冲突或者兼容的概念的. * 测试语句: select * from test_lock; show engine innodb status\G 检查检索信息. * 这两个语句都只能在显式的transaction中才能执行. 测试语句: select * from test_lock where code_index = beijing_city lock in share mode; select * from test_lock where code_index = beijing_city for update; SELECT ... LOCK IN

文档评论(0)

jiayou10 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档