指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生
案例
A给B转账100元钱的时候只执行了扣款语句,就提交了,此时如果突然断电,A账号已经发生了扣款,B账号却没有收到加款,在生活中就会引起纠纷。这种情况就需要事务的原子性来保证事务要么执行,要么就不执行。
指的事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
案例 对银行转账事务,不管事务成功还是失败,应该保证事务结束后,表中A和B的存款总额跟事务执行前一致
指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整的数据空间
在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
在事务管理中,原子性是基础,隔离性是手段,一致性是目的,持久性是结果
隔离 | 说明 | 效果 |
---|---|---|
read uncommitted | 读取尚未提交的数据 | 不解决脏读 |
read committed | 读取已经提交的数据 | 可以解决脏读 |
repeatable read | 重复读取 | 可以解决脏读 和 不可重复读 —mysql默认的 |
serializable | 串行化 | 可以解决 脏读 不可重复读 和 虚读—相当于锁表 |
show global variables like '%isolation%';
SELECT @@global.tx_isolation;
show session variables like '%isolation%';
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;
set global transaction isolation level read committed;
set session transaction isolation level read committed;
案例
create database SCHOOL;
use SCHOOL;
create table CLASS(
id int(10) primary key not null,
name varchar(40),
money double
);
insert into CLASS values(1,'A',1000);
insert into CLASS values(2,'B',1000);
select * from CLASS;
begin;
update CLASS set money= money - 100 where name='A';
select * from CLASS;
commit;
quit
mysql -u root -p
use SCHOOL;
select * from CLASS;
begin;
update CLASS set money= money + 100 where name='A';
select * from CLASS;
rollback;
quit
mysql -u root -p
use SCHOOL;
select * from CLASS;
begin;
update CLASS set money= money + 100 where name='A';
select * from CLASS;
SAVEPOINT S1;
update CLASS set money= money + 100 where name='B';
select * from CLASS;
SAVEPOINT S2;
insert into CLASS values(3,'C',1000);
select * from CLASS;
ROLLBACK TO S1;
select * from CLASS;
SET AUTOCOMMIT=0; #禁止自动提交
SET AUTOCOMMIT=1; #开启自动提交,Mysql默认为1
SHOW VARIABLES LIKE 'AUTOCOMMIT'; #查看Mysql中的AUTOCOMMIT值
use SCHOOL;
select * from CLASS;
SET AUTOCOMMIT=0;
SHOW VARIABLES LIKE 'AUTOCOMMIT';
update CLASS set money= money + 100 where name='B';
select * from CLASS;
quit
mysql -u root -p
use SCHOOL;
select * from CLASS;
MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
MySQL常用的存储引擎
1、MyISAM
2、InnoDB
MySQL数据库中的组件,负责执行实际的数据I/O操作
MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储
(1)静态(固定长度)表
(2)动态表
(3)压缩表
支持事务,支持4个事务隔离级别
MySQL从5.5.5版本开始,默认的存储引擎为 InnoDB
读写阻塞与事务隔离级别相关
能非常高效的缓存索引和数据
表与主键以簇的方式存储
支持分区、表空间,类似oracle数据库
支持外键约束,5.5前不支持全文索引,5.5后支持全文索引
对硬件资源要求还是比较高的场合
行级锁定,但是全 表扫描仍然会是表级锁定,如:update table set a=1 where user like ‘%lic%’;
InnoDB 中不保存表的行数,如 select count() from table; 时,InnoDB 需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。需要注意的是,当 count()语句包含 where 条件时 MyISAM 也需要扫描整个表
对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中可以和其他字段一起建立组合索引
清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表
show engines;
方法一
show table status from 库名 where name='表名'\G;
例:show table status from SCHOOL where name='CLASS'\G;
方法二
use 库名;
show create table 表名;
例:use SCHOOL;
show create table CLASS;
方法一:通过 alter table 修改
use 库名;
alter table 表名 engine=MyISAM;
例:use SCHOOL;
alter table CLASS engine=myisam;
show create table CLASS;
方法二:通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务
quit
vim /etc/my.cnf
[mysqld]
default-storage-engine=INNODB
systemctl restart mysqld.service
#注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。
systemctl restart mysqld.service
修改完记得重启mysql服务
#注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。
方法三:通过 create table 创建表时指定存储引擎
use 库名;
create table 表名(字段1 数据类型,...) engine=MyISAM;
例:mysql -u root -p
use SCHOOL;
create table hellolic (name varchar(10),age char(4))engine=myisam;
方法四:Mysql_convert_table_format转化存储引擎
Mysql-convert_table_format-user=root-password=密码
-sock=/tmp/mysql.sock -engine=引擎 库名 表名