什么是事务?
-
事务(Transaction)是作为单个逻辑工作单元执行的一系列操作
-
多个操作作为一个整体向系统提交,要么都执行,要么都不执行
事务的特性:
事务必须具备以下四种属性,简称ACID属性
1、原子性(Atomicity)
事务是一个完整的操作,事务的各步操作是不可分割的(原子的),要么都执行,要么都不执行。
2、一致性(Consistency)
当事务完成时,数据必须处于一致状态。
3、隔离性(Isolation)
并发事务之间彼此隔离、独立,它不应以任何方式依赖于或影响其他事务。
4、 持久性(Durability)
事务完成后,它对数据库的修改被永久保持。
如何创建事务
MySQL中支持事务的存储引擎有InnoDB和BDB。
开始事务 Begin;
提交事务 Commit;
回滚(撤回)事务 Rollback;
示例
DDL+DML
CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',`createDate` datetime DEFAULT NULL,`userName` varchar(20) DEFAULT NULL,`pwd` varchar(36) DEFAULT NULL,`phone` varchar(11) DEFAULT NULL,`age` tinyint(3) unsigned DEFAULT NULL,`sex` char(2) DEFAULT '男',`introduce` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;CREATE TABLE `result` (`rid` int(11) NOT NULL AUTO_INCREMENT COMMENT '成绩编号',`testName` varchar(255) DEFAULT NULL COMMENT '测试名称',`score` double(4,2) DEFAULT NULL COMMENT '成绩',`studentId` int(11) DEFAULT NULL COMMENT '学生id',PRIMARY KEY (`rid`),KEY `studentId` (`studentId`),CONSTRAINT `result_ibfk_1` FOREIGN KEY (`studentId`) REFERENCES `student` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
insert into student values(0,'2024-02-25 10:10:10','赵灵儿','123',
'15612345678',16,'女','逍遥哥哥,你终于找到我了。');
insert into student values(0,'2024-02-25 10:10:10','王语嫣','123',
'15612345678',17,'女','慕容复,我和你不共戴天。');
insert into student values(0,'2024-02-25 10:10:10','龙姑娘','123',
'15612345678',22,'女','我想过过过儿过过的日子。');
insert into student values(0,'2024-02-25 10:10:10','杨过','123',
'15612345678',18,'男','一遇杨过误终身。');
insert into student values(0,'2024-02-25 10:10:10','杨逍','123',
'15612345678',27,'男','杨过跟程英的大儿子。');
insert into student (userName,age,introduce)values('黄衣女子',26,'杨过与龙姑娘的大女儿。');insert into result values(0,'政治',96,1);
insert into result values(0,'地理',86,5);
insert into result values(0,'政治',77,3);
insert into result values(0,'英语',99,3);
insert into result values(0,'历史',22,6);
insert into result values(0,'化学',69,2);
insert into result values(0,'Java',79,5);
insert into result values(0,'Java',67,6);
insert into result values(0,'政治',97,2);
insert into result values(0,'物理',76,6);
insert into result values(0,'物理',82,2);
insert into result values(0,'化学',56,4);
DQL语句
update student set userName='流氓+渣男' where id=5;
begin; #开启事务
update student set userName='流氓and渣男' where id=5;
select * from student where id=5;
update student set userName='独臂大傻雕渣男' where id=4;
select * from student where id=4;
rollback; #通过undo log来完成还原操作的。
commit; #提交数据到硬盘,通过redo log完成的