赞
踩
Mysql默认存储引擎通过 SHOW ENGINES 命令可以看到,默认是 InnoDB 并且,从图中可以看出,也只有 InnoDB支持事务,
事务支持:
行级锁定:
外键约束:
崩溃恢复:
索引结构:
事务(Transaction)是指作为单个逻辑工作单元执行的一系列操作,要么全部执行成功,要么全部不执行,具有以下四大特性,简称为 ACID 特性:
原子性(Atomicity):
一致性(Consistency):
隔离性(Isolation):
持久性(Durability):
这四大特性确保了事务的可靠性和一致性,是保证数据库操作安全和正确性的重要基础。在设计和开发应用程序时,需要根据业务需求和数据操作的特点合理应用这些特性,以确保系统的可靠性和稳定性。
脏读(Dirty Read):
不可重复度(Non-Repeatable Read):
幻读(Phantom Read):
代码实例: 假设有一张名为 order 的订单表,包含 order_id
和 order_status
字段,初始状态如下:
order_id order_status
1 'pending'
2 'pending'
不可重复读:
// 事务1
begin transaction;
select * from orders where order_id = 1;
// 返回结果: order_id = 1, order_status = 'pending'
// 事务2
begin transaction;
update orders set order_status = 'completed' where order_id = 1;
commit;
// 事务1
select * from orders where order_id = 1;
// 返回结果: order_id = 1, order_status = 'completed'
在事务1中,第一次读取 order_id = 1 的数据时,order_status 为 pending。但在事务2中,order_id = 1 的数据被更新为 ‘completed’。在事务1再次读取同一个数据时,order_status 已经发生了改变,这就是不可重复读的情况。
幻读:
// 事务1
begin transaction;
select * from orders where order_id >= 1 and order_id <= 2;
// 返回结果: order_id = 1, order_status = 'pending'; order_id = 2, order_status = 'pending'
// 事务2
begin transaction;
insert into orders (order_id, order_status) values (3, 'pending');
commit;
// 事务1
select * from orders where order_id >= 1 and order_id <= 2;
// 返回结果: order_id = 1, order_status = 'pending'; order_id = 2, order_status = 'pending'; order_id = 3, order_status = 'pending'
在事务1中,第一次读取 order_id 在范围内的数据时,只有两条记录。但在事务2中,插入了一条新的订单记录。在事务1再次读取同一范围的数据时,发现多出了一条记录,这就是幻读的情况。
除了脏读、不可重复读和幻读之外,还有一些其他可能的并发问题:
丢失更新(Lost Update):
读取未提交数据(Read Uncommitted):
更新丢失(Update Lost):
READ UNCOMMITTED(读未提交):
READ COMMITTED(读已提交):
REPEATABLE READ(可重复读):
SERIALIZABLE(串行化):
在 MySQL 中,默认的事务隔离级别是 REPEATABLE READ(可重复读)。这意味着当你启动一个新的事务时,它的隔离级别会默认设置为可重复读。如果需要更改隔离级别,可以在事务内部使用 SET TRANSACTION 命令进行设置,例如:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
或者在连接数据库之后,可以使用以下语句设置全局的隔离级别:
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
需要注意的是,事务隔离级别的选择应根据具体的业务需求和对并发问题的容忍程度来确定,需要权衡事务的隔离性和性能之间的关系。
MySQL 的事务隔离级别是基于锁实现的,但是具体的实现方式会根据不同的存储引擎而有所不同。
在 InnoDB 存储引擎中,MySQL 使用了多版本并发控制(MVCC)来实现不同隔离级别下的并发控制,而不仅仅依赖于锁。MVCC 通过记录数据的多个版本来支持不同的隔离级别,从而实现了高并发的读取操作,避免了大部分情况下的锁竞争问题。
具体来说,在 InnoDB 中,读操作不会阻塞写操作,写操作也不会阻塞读操作,因为它们都采用了多版本并发控制,通过版本控制和事务的启动时间戳来实现对事务的隔离。
当然,在某些情况下,InnoDB 也会使用锁来实现特定的隔离级别。例如,对于 SERIALIZABLE 隔离级别,InnoDB 会使用锁来确保事务的串行执行,以避免幻读问题。
总的来说,MySQL 的事务隔离级别是基于多版本并发控制和锁机制共同实现的,以保证事务的隔离性和并发性。
InnoDB 存储引擎通过多版本并发控制(MVCC)来实现对不同事务隔离级别的支持,其具体实现包括以下几个关键组成部分:
版本号:
undo log:
Read View:
事务版本号:
基于以上几个关键组成部分,InnoDB
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。