上一篇 <<<MySql的表锁行锁及间隙锁
下一篇 >>>MySQL的MVCC多版本控制原理
事务传输属性是代码层面的,非数据库层面。
1.事务基本特性
2.事务的并发问题
2.1 脏读(一个事务读取另外一个未提交又回滚事务的数据)
2.2不可重复读(两次读取相同的数据不一致,中间被修改或删除了)
2.3幻读(两次读取相同的数据不一致,中间新增了)
3.事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
未提交读(Read uncommitted) | 可能 | 可能 | 可能 |
已提交读(Read committed) | 不可能 | 可能 | 可能 |
可重复读(Repeatable read) | 不可能 | 不可能 | 可能 |
可串行化(Serializable) | 不可能 | 不可能 | 不可能 |
3.隔离级别验证
3.1读未提交 可能会产生脏读
## 设置级别
set tx_isolation='read-uncommitted';
##sessionA 执行
set tx_isolation='read-uncommitted';
select @@tx_isolation;
begin ;
select * from jarye_account;
update jarye_account set balance=balance-50 where id=1;
commit;
##如果我们的sessionA执行rollback;的情况下,sessionB使用脏读数据操作。
##sessionB执行
set tx_isolation='read-uncommitted';
select @@tx_isolation;
use jaryedb;
begin ;
select * from jarye_account;
commit;
3.2读已提交 避免脏读的问题
set tx_isolation='read-committed';
##sessionA
set tx_isolation='read-committed';
select @@tx_isolation;
begin ;
select * from jarye_account;
update jarye_account set balance=balance-50 where id=1;
commit;
##sessionB
set tx_isolation='read-committed';
select @@tx_isolation;
begin ;
select * from jarye_account;
update jarye_account set balance=balance-50 where id=1;
commit;
3.3 可重复读
set tx_isolation='repeatable-read';
##sessionA
set tx_isolation='repeatable-read';
select @@tx_isolation;
begin ;
select * from jarye_account;
update jarye_account set balance=balance-50 where id=1;
commit;
##sessionB
set tx_isolation='repeatable-read';
select @@tx_isolation;
begin ;
select * from jarye_account;
commit;
3.4 验证幻读
sessionA
begin;-- 获取全局事务id 1
-- select * from jarye_account where DB_TRX_ID=1
select * from jarye_account
commit;
sessionB
INSERT INTO `jarye_account` VALUES (14, 'jarye66', '500');
在sessionA 执行
update jarye_account set balance=300 where id = 14;
出现幻读
3.5 串行化
sessionA
set tx_isolation='serializable';
begin ;
update jarye_account set balance=balance-50 where id=1;
commit;
sessionB
begin ;
select * from jarye_account where balance='500';
INSERT INTO `jarye_account` VALUES (null, 'raby888', '500');
推荐阅读:
<<<MySQL发展历程与整体架构
<<<MySql连接空闲8小时自动断开的原因及连接池配置方法
<<<查询和更新sql语句执行原理
<<<MySQL存储引擎汇总
<<<InnoDB存储引擎的Buffer Pool 缓冲池底层结构
<<<Too many connections分析与processlist解读
<<<MySQL索引底层结构与实现原理
<<<MySql的表锁行锁及间隙锁
<<<MySQL的MVCC多版本控制原理
<<<MySQL常用命令汇总