目录
前置建表
编辑
一、什么是事务
二、事务特性ACID
1、原子性(Atomicity)
2、一致性(Consistency)
3、隔离性(Isolation)
4、持久性(Durability)
三、事务控制
1、ROLLBACK
2、COMMIT
使用 set autocommit=0;命令修改默认提交方式为FALSE
前置建表
CREATE TABLE student (
id int NOT NULL AUTO_INCREMENT COMMENT '主键',
code varchar(255) NOT NULL COMMENT '学号',
name varchar(255) DEFAULT NULL COMMENT '姓名',
sex enum('男','女') DEFAULT NULL COMMENT '性别',
age int(0) NULL COMMENT '年龄',
PRIMARY KEY (`id`)
);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (1, '20220101', '张三', '男', 12);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (2, '202202', '李四', '男', 14);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (3, '202203', '王五', '女', 10);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (4, '202204', '张三飞', '男', 20);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (5, '202205', '小丽', '女', 10);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (6, '202206', '小明', '男', 11);
数据如下
一、什么是事务
在MySQL的环境中,一个事务由作为一个单独单元的一个或者多个SQL语句组成。这个单元中的每个SQL语句是互相依赖的,而且单元作为一个整体是不可分割的。如果单元中的---个语句不能成功地完成,整个单元就会回滚,所有影响到的数据将返回到事务开始以前的状态。因而,只有事务中的所有语句都被成功地执行才能说这个事务被成功地执行。比如银行转账,银行的账户会扣掉对应的钱,你的账户会加上对应的钱,而这两步操作必须同时成功,不能说银行的钱扣了,你账户的钱没有增加。
二、事务特性ACID
1、原子性(Atomicity)
原子性意味着每个事务都必须被认为是一个不可分割的单元。假设一个事务由两个或者多个任务组成,其中的语句必须同时成功才能认为事务是成功的。如果事务失败,系统将会返回到事务以前的状态。
2、一致性(Consistency)
不管事务是完全成功完成还是中途失败,当事务使系统处于一致的状态时存在一致性。在MySQL中,一致性主要由MySQL的日志机制处理,它记录了数据库的所有变化,为事务恢复提供了跟踪记录。如果系统在事务处理中间发生错误,MySQL恢复过程将使用这些日志来发现事务是否已经完全成功地执行,是否需要返回。因而一致性属性保证了数据库从不返回一个未处理完的事务。
3、隔离性(Isolation)
隔离性是指每个事务在它自已的空间发生,和其他发生在系统中的事务隔离,而且事务的结果只有在它完全被执行时才能看到。即使在这样的一个系统中同时发生了多个事务,隔离性原则保证某个特定事务在完全完成之前,其结果是看不见的。例如,在前面的股票交易例子中,孤立性是指两个交易者之间的事务和交易中的其他事务是不互相影响的,而且它的结果只有在被完成时才能显示给公众。
4、持久性(Durability)
持久性是指即使系统崩溃,一个提交的事务仍在坚持。当一个事务完成,数据库的口志已经被更新时,持久性就开始发生作用。大多数RDBMS产品通过保存所有行为的日志来保证数据的持久性,这些行为是指在数据库中以任何方法更改数据。数据库日志记录了所有对于表的更新、查询、报表等。
三、事务控制
事务(transaction)指一组SQL语句;
回退(rollback)指撤销指定SQL语句的过程;
提交(commit)指将未存储的SQL语句结果写入数据库表;
保留点(savepoint)指事务处理中设置的临时占位符(place-holder),你可以对它发布回退(与回退整个事务处理不同)。
1、ROLLBACK
MySQL的ROLLBACK命令用来回退(撤销)MySQL语句。ROLLBACK只能在一个事务处理内使用(在执行一条TRANSACTION命令之后)。事务处理用来管理INSERT、UPDATE和 DELETE语句。你不能回退SELECT语句。(这样做也没有什么意 义。)你不能回退CREATE或DROP操作。事务处理块中可以使用这两条语句,但如果你执行回退,它们不会被撤销TRANSACTION命令之后。
如以下语句,开启事务,删除sql执行之后再执行ROLLBACK,则事务回滚,删除的sql就相当于无效
SELECT * from student ; -- 结果1
START TRANSACTION;
DELETE FROM student ;
ROLLBACK;
SELECT * from student ; -- 结果2
2、COMMIT
一般的MySQL语句都是直接针对数据库表执行和编写的。这就是所谓的隐含提交(implicit commit),即提交(写或保存)操作是自动进行的。比如我们写update语句就可以直接更新数据,写delete就可以删除数据。为了测试,我们就更改下默认提交方式来试下。
使用以下命令查看默认提交方式,value为ON则表示开启。
show variables like 'autocommit';
使用 set autocommit=0;命令修改默认提交方式为FALSE
set autocommit=1;
然后进行测试,执行更新语句
update student a set a.name='张三11' where a.id=1;
然后我们查询以下,结果却如下,张三的名字改为了张三11,但是我们不是修改了默认提交方式,而且也没有使用commilt命令么??
那是因为我们在同一个窗口查询的数据就是在一个事务里边的,目前还处于一个commit之前的状态,我们在当前事务查看当然是已经修改的了,于是重新打开一个窗口或者建立一个连接,再进行查询,结果如下:张三是未被修改掉的,如果没有执行COMMIT命令,则无法直接更新数据。
于是加上COMMIT语句之后,再次再新窗口查询,则发现已经被修改掉。
START TRANSACTION;
update student a set a.name='张三11' where a.id=1;
COMMIT;