- 浏览: 523816 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (422)
- 重要 (12)
- BUG解决备忘录 (32)
- 环境搭建 (17)
- 开源组件 (4)
- 数据库 (16)
- 设计模式 (4)
- 测试 (3)
- javascript (5)
- Android (14)
- jdk相关 (9)
- struts2 (10)
- freemark (3)
- 自定义扩展及工具类 (5)
- jdk5新特性及java基础 (13)
- ssh及其他框架 (15)
- linux (32)
- tcp-ip http协议 (8)
- 服务器集群与负载均衡 (34)
- 项目管理相关 (11)
- 实用小技术 (10)
- 架构相关 (14)
- firefox组件 (11)
- spider (6)
- 产品设计 (11)
- PHP (1)
- ws (4)
- lucene (10)
- 其他 (2)
- BI (1)
- NoSQL (3)
- gzip (1)
- ext (4)
- db (6)
- socket (1)
- 源码阅读 (2)
- NIO (2)
- 图片处理 (1)
- java 环境 (2)
- 项目管理 (4)
- 从程序员到项目经理(一):没有捷径 (1)
- bug (1)
- JAVA BASE (8)
- 技术原理 (0)
- 新框架新技术 (1)
- 量化与python (1)
- 系统编程 (0)
- C语言 (0)
- 汇编 (0)
- 算法 (0)
最新评论
-
hyspace:
别逗了,最后一个算法根本不是最优的,sort(function ...
数组去重——一道前端校招试题 -
washingtin:
楼主能把策略和路由的类代码贴出来吗
Spring + iBatis 的多库横向切分简易解决思路 -
sdyjmc:
初略看了一下,没有闹明白啊,均衡负载使用Nginx,sessi ...
J2EE集群原理 I -
shandeai520:
谢谢大神!请教大神一个问题:假如我有三台服务器,连接池的上限是 ...
集群和数据库负载均衡的研究 -
hekuilove:
给lz推荐一下apache commonsStringUtil ...
request 获取 ip
InnoDB实现标准行级锁定,在这里有两种类型的锁: locks:
·共享的(S
)锁允许一个事务去读一行(tuple)。
·独占的锁(X
)允许一个事务更新或删除一行。
如果事务A
在tuple t
上持有独占锁定,来自不同事务B
的对t
上任一类型的锁的请求不被马上许可,取而代之地,事务B
不得不等待事务t释放在tuple t
上的锁。
如果事务 A
在tuple t
上持有一个共享的锁(S
),那么:
·来自不同的事务B
对在t
上X
的锁定请求不能被马上许可。
·来自不同的事务B
对在t
上S
的锁定请求可以被马上获准。因此A
和B
持有t
上的S
锁定。
不仅如此,InnoDB支持多间隔尺寸锁定
,它允许记录锁和对整个表的锁共存。要使得多间隔尺寸级别的锁定实际化,额外类型的锁,被称为intention locks
被使用。在InnoDB中,意图锁定是表锁定。 对于一个事务,意图锁定之后理想的是指明在该表中对一个行随后需要哪一类型的锁定(共享还是独占)。
有两种意图锁被用在InnoDB中(假设事务T
在表R
中要求一个已指出的类型的锁):
·意图共享(IS
):事务T
意图给表T
上单独的tuple设置S
锁定。
·意图独占(IX
):事务T
意图给这些tuple设置X
锁定。
意图锁协议如下:
·在假设的事务可以获得对某假定行的S
锁定之前,它必须首先获得对包含该行的表的一个IS
或者更强的锁定。
·在假设的事务可以获得对某假定行的X
锁定之前,它必须首先获得对包含该行的表的一个IX
锁定。
这些结果可以方便地用一个锁类型兼容矩阵来总结:
|
X |
IX |
S |
IS |
X |
冲突 |
冲突 |
冲突 |
冲突 |
IX |
冲突 |
兼容 |
冲突 |
兼容 |
S |
冲突 |
冲突 |
兼容 |
兼容 |
IS |
冲突 |
兼容 |
兼容 |
兼容 |
如果一个锁定与现在锁定兼容的话,它被授给一个委托事务。如果一个锁定与现存锁定冲突,它就不被授予一个委托事务。事务等待着直到冲突的现存锁定被释放掉。如果一个锁定请求与现存锁定相冲突,且不能被授予,因为它可能会导致死锁,一个错误产生。
因此,意图锁定不阻碍任何东西,除了完全表请求(比如LOCK TABLES ... WRITE)。IX
和IS
锁定的主要目的是显示某人正锁定一行,或将要在表中锁定一行。
下列的例子演示当锁定请求可能会导致死锁之时一个错误会如何发生。例子中包括两个客户端A和B。
首先客户端A创建一个包含一个行的表,然后开始一个事务。在这个事务内,A通过在共享模式选择行获得对行的S
锁定:
mysql> CREATE TABLE t (i INT) ENGINE = InnoDB;
Query OK, 0 rows affected (1.07 sec)
mysql> INSERT INTO t (i) VALUES(1);
Query OK, 1 row affected (0.09 sec)
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM t WHERE i = 1 LOCK IN SHARE MODE;
+------+
| i |
+------+
|1 |
+------+
1 row in set (0.10 sec)
接着,客户端B开始一个事务并尝试从该表删除行:
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec) mysql> DELETE FROM t WHERE i = 1;
删除操作要求一个X
锁定。因为这个锁定不兼容客户端A持有的S
锁定,所以X
锁定不被允许,所以请求进入对行及客户端阻挡的锁定请求队列。
最后,客户端A也试图从表中删除该行:
mysql> DELETE FROM t WHERE i = 1;
ERROR 1213 (40001): Deadlock found when trying to get lock;try restarting transaction
因为客户端A需要一个X
锁定来删除该行,所以在这里发生死锁。尽管如此,锁定请求不被允许,因为客户端B已经有一个对X
锁定的请求并且它正等待客户端A释放S
锁定。因为客户端B之前对X
锁定的请求,被客户端A持有的S
锁定也不能升级到X
锁定。因此,InnoDB对客户端A产生一个错误,并且释放它的锁定。在那一点上,客户端B的锁定请求可以被许可,并且客户端B从表中删除行。
发表评论
-
One of the two will be used. Which one is undefined.
2019-04-22 23:13 596Mac版IntelliJ IDEA Class JavaLa ... -
Eclipse不提示的解决办法
2012-11-20 11:40 1291我们知道,在Eclipse中可 ... -
Hibernate-Validation的使用
2012-03-18 11:56 1458以前弄过hibernate-validation的,可今天 ... -
web.xml配置错误页面不起作用
2010-12-15 00:08 1075出现异常时没有进入到 common/500.jsp 页面 ... -
struts2 :Unable to load configuration. ……struts-default.xml:46:178异常解
2010-12-08 09:38 1131这个问题是缺 ... -
jsp中EL表达式不能显示的解决方法
2010-12-04 23:23 2415网友一:jsp中EL表达式 ... -
FreeMark常用内置函数使用说明
2010-11-27 11:59 889在我们应用Freemarker过程中,经常会操作例如字符串,数 ... -
lucene 排序
2010-11-18 18:42 959Lucene的默认排序是按照D ... -
设置tomcat内存
2010-11-02 10:21 1283设置tomcat内存 大家都 ... -
没有启动服务器服务,此时尚未创建共享资源的解决方法是什么
2010-11-01 10:57 1748方法一: 在桌面=>>我的电脑=>> ... -
struts2+displaytag翻页时Inappropriate OGNL expression解决方案(solution)
2010-10-23 11:21 1490相信肯定有人遇到这个问题: struts2+displa ... -
Tomcat性能参数
2010-10-21 23:40 1263maxThreads:Tomcat能处理的最大请求数(To ... -
多线程往Oracle数据库里插入数据的优化
2010-10-21 23:39 4602昨 天做了一个东西,要实现解析txt文件,然后入库的功 ... -
JSTL操作Map
2010-10-21 23:38 23801、迭代 当forEach 的items属性中的 ... -
Quartz的cron表达式
2010-10-21 23:37 838一个cron表达式有至少6 ... -
IBatis的缓存
2010-10-21 23:31 917在xml配置文件中,每一个 cacheModel 元素,如下 ... -
Hibernate中get和load方法的区别
2010-10-21 23:27 765Hibernate3.2 Session加载数据时get和lo ... -
java的堆与栈的区别
2010-10-21 23:27 733Java的堆是一个运行时数据区,类的对象从中分配空间 。这些对 ... -
IBatis和Spring结合时的Blob乱码处理
2010-10-21 23:24 1584按照网上说的Spring和IBatis结合的时候要用以下配置进 ... -
经典SQL语句集锦
2010-10-18 20:40 884转自: http://blog.csdn.net/shixin ...
相关推荐
7. **自适应哈希索引(Adaptive Hash Index)**:InnoDB会根据查询模式自动创建哈希索引,提升热点数据的查询速度。 8. **空间索引(Spatial Index)**:InnoDB支持空间索引,可以处理地理空间数据,适用于GIS应用...
lock_mode`控制自增列的锁定模式,`innodb_buffer_pool_size`设定缓冲池大小,以及`innodb_flush_log_at_trx_commit`决定事务日志何时写入磁盘等。这些变量可以根据系统需求进行优化。 7. **其他特性**: InnoDB还...
MySQL数据库系统在当今数据存储领域占据着重要的地位,尤其在InnoDB存储引擎的支持下,它提供了事务处理、行级锁定以及外键约束等功能,使得MySQL能够满足复杂的业务需求。InnoDB是MySQL中最常用的存储引擎,其性能...
InnoDB是MySQL数据库管理系统中的一个重要存储引擎,以其事务安全、行级锁定和ACID(原子性、一致性、隔离性和持久性)特性而闻名。InnoDB Plugin是InnoDB存储引擎的一个增强版本,旨在提供更高的性能、更灵活的功能...
【一致性非锁定读取】是InnoDB存储引擎在处理事务时的一种优化策略,它允许查询在不锁定数据行的情况下获取信息,从而提高并发性能。在MySQL中,这主要体现在两个事务隔离级别:可重复读(REPEATABLE READ)和读已...
MySQL的InnoDB存储引擎是一种广泛使用的事务处理引擎,支持行级锁定和外键约束等功能。本文将深入解析InnoDB存储引擎中的表存储机制,重点介绍其如何管理和存储数据。 #### InnoDB表存储结构 InnoDB表存储结构的...
InnoDB是MySQL数据库中使用最为广泛的存储引擎之一,它是一个提供事务支持、行级锁定和外键约束等功能的数据库引擎。由Jeremy Cole和Davi Arnaut所著的《InnoDB核心内幕》("Innodb core内幕")对InnoDB的内部机制...
- **自适应哈希索引**:InnoDB 会根据数据访问模式自动创建哈希索引,进一步加快某些查询的速度。 - **重做日志**:InnoDB 使用重做日志来记录数据修改操作,以便在系统崩溃后能够恢复数据。这保证了事务的持久性。 ...
InnoDB作为MySQL中最常用且功能强大的存储引擎之一,它不仅支持事务(ACID兼容)、外键约束、行级锁定等特性,还提供了多版本并发控制(MVCC)以提高并发性能。此外,InnoDB通过缓冲池来缓存数据和索引,从而显著...
InnoDB 是一种行级锁定的存储引擎,支持事务处理,并且为每行记录都保存一个行锁,这使得它在高并发环境下的表现更佳。而 MyISAM 使用的是表级锁定策略,这意味着当对某个表进行写入操作时,该表将被锁定,直到操作...
首先,InnoDB是一个重要的MySQL存储引擎,以其事务处理能力和行级锁定的特性而著名。Calvin Sun在演讲中首先介绍了InnoDB的历史和它在MySQL中的发展路线。InnoDB的发展始于1990年左右,并且它的一些关键特性随着时间...
4. **Enhanced Locking**: 在InnoDB 8.0中,行级锁定机制得到了增强,引入了“Next-Key Locks”的优化,减少死锁的发生。此外,也提供了更精细的加锁选项,比如Gap Locks和Record Locks,以便更好地控制并发访问。 ...
4. **间隙锁(Gap Locks)和Next-Key Locks**:为了防止“幻读”问题,InnoDB会自动在会话事务中加上间隙锁,锁定数据行之间的“间隙”,并使用Next-Key Locks来锁定索引键及其之前的数据项,从而保证数据的一致性。...
16. **自适应哈希索引**:InnoDB会根据查询模式自动创建和维护哈希索引,提高常见查询的速度。 17. **InnoDB的故障恢复**:通过redo和undo日志,InnoDB可以在系统崩溃后恢复未完成的事务,保持数据一致性。 18. **...
在InnoDB中,行级锁定机制减少了锁定资源的需求,提高了并发性能。插入缓冲(Insert Buffer)优化了插入操作,特别是对于非聚簇索引的插入。重做日志(Redo Log)用于记录事务对数据页的更改,确保在系统崩溃时能够...
在这篇文章里我将讨论一个相关的主题 – InnoDB 事务隔离模式,还有它们与MVCC(多版本并发控制)的关系,以及它们是如何影响MySQL性能的。 MySQL手册提供了一个关于MySQL支持的事务隔离模式的恰当描述 – 在这里我...
除此之外,InnoDB还存在一些特殊的锁模式,例如插入意向锁(LOCK_INSERT_INTENTION),用于管理插入操作的并发。 #### 锁的属性 锁的属性进一步细化了锁的行为。例如,LOCK-gap用于锁定索引记录前的间隙,而LOCK-...