1、准备
-- 创建一个数据库
create database if not exists bank;
-- 切换到bank数据库进行操作
use bank;
-- 创建一个person的表结构
create table person(
`id` int not null auto_increment comment '编号',
`name` varchar(30) not null default '无名氏' comment '姓名',
`money` decimal(12,2) default 0.00 comment '存款',
primary key(`id`)
)engine= innodb charset=utf8;
-- engine:数据库引擎,默认是innodb,myisam以前使用比较多
-- 特性 innodb myisam 比较
-- 事务 支持 不支持
-- 外键 支持 不支持
-- 索引 不支持全文索引 全文索引,在涉及全文索引领域的查询效率上MyISAM速度更快高 注意:5.7以后的InnoDB支持全文索引了
-- 锁 支持表、行(默认)级锁 只支持表级锁
-- 给表里插入数据
insert into person (`name`,`money`) values ('a',1000.00),('b',500);
-- ===========================模拟一下事务===============================
-- 特性:
-- 1.原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成(一个失败就全部失败,全部成功才成功)
-- 2.一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏
-- 3.持久性:事务处理结束后,对数据的修改就是永久的
-- 4.隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力
-- 事务的隔离级别:
-- 隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
-- 未提交读(Read uncommitted) 可能 可能 可能
-- 已提交读(Read committed) 不可能 可能 可能
-- 可重复读(Repeatable read) 不可能 不可能 可能
-- 可串行化(Serializable ) 不可能 不可能 不可能
2、测试事务
set autocommit =0;-- 关闭事务自动提交 0:关闭(系统默认是开启状态)
start transaction;
update person set money = money-100 where `name` = 'a'; -- a账户转出00元
update person set money = money+200 where `name` = 'b'; -- b账户收入200元
commit; -- 如果以上语句执行成功,则提交事务
rollback; -- 如果执行失败,则执行回滚操作
set autocommit = 1; -- 开启事务自动提交 1:开启
3、测试事务中建表
set autocommit =0;-- 关闭事务自动提交 0:关闭(系统默认是开启状态)
start transaction;
update person set money = money-100 where `name` = 'a'; -- a账户转出200元
update person set money = money+200 where `name` = 'b'; -- b账户收入200元
-- 创建一个person的表结构
create table person2(
`id` int not null auto_increment comment '编号',
`name` varchar(30) not null default '无名氏' comment '姓名',
`money` decimal(12,2) default 0.00 comment '存款',
primary key(`id`)
)engine= innodb charset=utf8;
commit; -- 如果以上语句执行成功,则提交事务
rollback; -- 如果执行失败,则执行回滚操作
set autocommit = 1; -- 开启事务自动提交 1:开启
正常
4、事务中建表(事务中出现异常)
set autocommit =0;-- 关闭事务自动提交 0:关闭(系统默认是开启状态)
start transaction;
update person set money = money-100 where `name` = 'a'; -- a账户转出200元
update person set money = money+200 where `name` = 'b'; -- b账户收入200元
-- 创建一个person的表结构
create table person3(
`id` int not null auto_increment comment '编号',
`name` varchar(30) not null default '无名氏' comment '姓名',
`money` decimal(12,2) default 0.00 comment '存款',
primary key(`id`)
)engine= innodb charset=utf8;
999 -- 异常
commit; -- 如果以上语句执行成功,则提交事务
rollback; -- 如果执行失败,则执行回滚操作
set autocommit = 1; -- 开启事务自动提交 1:开启
表还是创建出来了
5、结论
结论:MySQL的DDL语句是非事务的,MySQL 事务 是对数据进行操作,对结构没有影响,比如创建表、删除表,事务就不起作用