MYSQL事务实现原理

1、事务的隔离级别
隔离级别解决问题备注
读未提交脏读可以查询到其他事务未提交的数据。
读已提交 RC不可重复读(1、乐观锁 加版本号解决脏写 2、行锁 --悲观锁 解决脏写 )只能读到其他事务已经提交的数据。
可重复读 RR幻读读操作需要加事务,写操作加写事务保证可重复读。如果不加事务就是读已提交
串行化解决上面所有问题 包括脏写实现原理:select 加读锁 。 update 加 写锁。
名称描述
脏读(Dirty Reads)事务A读取到了事务B已经修改但尚未提交的数据
不可重读(Non-Repeatable Reads)事务A内部的相同查询语句在不同时刻读出的结果不一致
幻读事务A读取到了事务B提交的新增数据
脏写当两个或多个事务选择同一行数据修改,有可能发生更新丢失问题,即最后的更新覆盖了由其他事务所做的更新。
解决脏写(1)RR 、RC 数据库级别updaet (2) 串行化
2、可重复读详解

(1) 可重复读并发修改问题
描述:事务A 读到 lilei 1500 后,事务B 修改Leilei 2000 , java中为leilei 加500 ,此时 ,是1500 + 500 =2000 , 应该是2500。
(2) 可重复读原理描述
当事务执行第一条SQL语句时,之后所有的读操作都是读数据库当时的数据。相当于读快照(readview)。 但是修改操作还是取数据库最新版本做操作。
之后如果执行update where id = 1 ; 语句的话,再查 id =1; 就是修改后的数据。此时因为有行锁其他事务无法修改 id=1的数据
总结:可重复读所有的查询都是快照读,更新都是当前读。

3、MVCC多版本并发控制机制

RR、RC原理详解:
根据回滚指针 (insert 语句 id=1 指向 undo log delete id =1 )
如果需要回滚事务 , 直接执行 undo log delete id =1。

idnamebalancetrx_id (事务ID )roll_pointer(回滚指针)
1lilei01insert undo log
1lilei5002指向 上一行 id=1commited
1lilei8003commited
1lilei10004commited

事务A RR
事务 2 commited
select * from account where id = 1 ; ----> 500
事务 3 commited 去查还是 500
事务 4 还未提交 去查还是 500

事务B RC
事务 2 commited
select * from account where id = 1 ; ----> 500
事务 3 commited 去查是 800
事务 4 还未提交 去查 是800

4、锁机制

(1)乐观锁:读已提交隔离级别下使用。
读锁(共享锁、S锁):select … lock in share mode; (一般的select 都不会加锁)
(2) 读锁是共享的,多个事务可以同时读取同一个资源,但不允许其他事务修改
(3)写锁(排它锁、X锁):select … for update;
写锁是排他的,会阻塞其他的写锁和读锁,update、delete、insert都会加写锁
MYSQL锁机制详解

5、面试刨析:查询操作方法需要使用事务吗?

(1) 一条 select 不需要
(2) 2 或多条 select
看隔离级别 RR 下 , 加 readolne = true (读事务) 可以保证数据再同一时间维度下。
RC 下, 读到的是最新的数据。 读操作没必要加事务。

6、持久性:一旦提交了事务,它对数据库的改变就应该是永久性的。持久性由redo log日志来实现。

MYSQL事务持久性详解

结尾
事务隔离级别演示

	CREATE TABLE `account` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `balance` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
  ENGINE=InnoDB DEFAULT CHARSET=utf8;
  INSERT INTO `test`.`account` (`name`, `balance`) VALUES ('lilei', '450');
  INSERT INTO `test`.`account` (`name`, `balance`) VALUES ('hanmei', '16000');
  INSERT INTO `test`.`account` (`name`, `balance`) VALUES ('lucy', '2400');
BEGIN 
set tx_isolation='read‐uncommitted';
set tx_isolation='read‐committed';
set tx_isolation='repeatable‐read';
set tx_isolation='serializable';
COMMIT;

在这里插入图片描述
update 放 insert后会好一点。
update 可能别的事务需要使用。放后面等待时间少一点。

  • 20
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MySQL事务实现的原理主要涉及ACID特性以及锁机制。 ACID是指事务的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。原子性表示事务的所有操作要么全部成功,要么全部失败回滚;一致性保证了事务执行前后数据库的完整性;隔离性确保并发执行的事务相互之间是隔离的,互不干扰;持久性保证了一旦事务提交,其结果将永久保存在数据库中。 MySQL使用锁机制来实现事务的隔离性。当多个事务同时对数据库进行读写操作时,为了避免数据的不一致性,MySQL会使用不同的锁来保证事务的隔离性。 MySQL提供两种类型的锁:共享锁(S锁)和排他锁(X锁)。共享锁允许事务进行读操作,但不允许进行写操作;排他锁允许事务进行读写操作。当一个事务需要对某个数据进行修改时,它会先申请排他锁,其他事务需要读取该数据时,需等待排他锁释放。 MySQL中还存在多个隔离级别,包括读未提交、读提交、可重复读和串行化。每个隔离级别会对并发事务的读写操作进行不同程度的锁定控制,从而保证事务的隔离性。 总结来说,MySQL事务实现原理是通过ACID特性和锁机制来保证事务的原子性、一致性、隔离性和持久性。锁机制通过共享锁和排他锁来控制对数据的读写访问,不同的隔离级别则决定了锁的粒度和控制方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天使彦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值