事务处理
在计算机科学中,事务是无法被分割的操作,事务处理就是被分割为个体的信息处理。事务必须作为一个完整的单元成功或失败,不可能存在部分完成的事务。
例如,当你在网上书店购买了一本书,你用钱换了一本书(以信贷的方式)。如果你的信用是好的,一系列相关的操作会确保你拿到书并且书店会收到你的钱。然而,在交易时如果在那一系列操作中的单个操作执行失败,整个交易就会失败。你拿不到书,书店也不会收到你的钱。负责交易的平衡和可预测的技术就叫做事务处理。
前提:数据库引擎必须是InnoDB类型。
在mysql中,MyISAM和InnoDB是最常用的两种引擎,(其中MyISAM是默认引擎),其中 MyISAM 支持全文本搜索,但不支持事务;而 InnoDB 不支持全文本搜索,但支持事务。
事务处理可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。
1、事务(transaction):指一组SQL语句
2、回退(rollback): 指撤销指定的SQL语句的过程
3、提交(commit): 指将未存储的SQL语句结果写入数据库
4、保留点(savepoint): 指事务处理中设置的临时占位符,你可以利用它来发布回退(与回退整个事务处理不同)。
用法示例:
--创建表并插入数据
CREATE TABLE `orders`(
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(11) NULL,
`order_no` VARCHAR(32) NULL,
PRIMARY KEY (`id`)
)ENGINE=INNODB CHARSET=utf8;
CREATE TABLE `orderdetail`(
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`order_no` VARCHAR(32) NULL,
`detail` TEXT NULL,
PRIMARY KEY (`id`)
)ENGINE=INNODB CHARSET=utf8;
INSERT INTO orders(user_id,order_no)
VALUES(1,'1'),(2,'2'),(3,'3');
INSERT INTO orderdetail(order_no,detail)
VALUES('1','detail1'),('2','detail2'),('3','detail3');
一、事务(transaction),回退(rollback)
SELECT * FROM orders;
START TRANSACTION;//开启事务
DELETE FROM orders;//删除orders表所有的数据
SELECT * FROM orders;//这里返回的是空,因为前面已经清空所有的数据。
ROLLBACK;//回退MySQL到前一个安全状态
SELECT * FROM orders;//返回三条数据
- ROLLBACK只能在一个事务处理内使用(在执行一条START TRANSACTION命令之后)
- 事务处理用来管理 INSERT、UPDATE、DELETE语句,不能回滚SELECT语句
二、提交(commit)
START TRANSCATION;
DELETE FROM orders WHERE order_no='123456';
DELETE FROM orderdetail WHERE order_no='123456';
//删除两张表的的订单号为123456的订单
COMMIT;//提交删除操作
三、使用保留点
CREATE TABLE customer(
id INT(11) NOT NULL AUTO_INCREMENT,
name TEXT NULL,
age INT(3) NULL,
PRIMARY KEY (id)
)ENGINE=INNODB;
//引擎为InnoDB,因为要用到事务
//开启事务
START TRANSACTION;
INSERT INTO customer(name,age) VALUES(LSGO实验室,20);//这里我故意写错
SAVEPOINT err1;//创建保留点
INSERT INTO orders(user_id,order_no) VALUES(10,'456123');
INSERT INTO orderdetail(order_no,detail) VALUES('456123','螺蛳粉');
ROLLBACK TO SAVEPOINT err1;
//如果不加commit,那么数据并没有写入到数据库中,只是写到了缓存中,直接查询数据库是没有插入的值的
COMMIT;
四、更改默认的提交行为:
SET autocommit = 0;
事务的特性:
1.原子性(Atomicity):
事务中的一组操作是不可分割的,要么全部成功,要么全部撤销。
解释:
事务的每一步操作必须全部成功。
示例:
银行转账,A转账给B 500。
有A -500,B +500两个步骤。
其中任一步出错,则转账失败。此为事务的原子性。
2.一致性(Consistency):
几个事务并发执行,其执行结果必须和按照某种顺序串行执行这些事务的效果是一样的。即事务执行前后,数据库的数据要保持一致性。
解释:
事务的每一步操作执行的结果必须前后一致。
示例:
银行转账。A转账B 500。
此时,A减500,B加300。则转账失败。此为事务的一致性。
3.隔离性(Isolation):
事务的执行不受其它事务的影响,并发执行的几个事务,互不影响。事务执行的中间结果对其它事务必须是透明的(不可见)。
解释:
事务结束前,每一步操作带来的影响,别的会话看不见。
示例:
银行转账,A 转账给B 500元钱。
这时,B的钱加500成功,A的钱减少500成功,但在ATM上查看A和B的钱时,都是没有变的。
原因为事务的隔离性,在事务结束前(未执行commit),其他会话窗口(这里的ATM机)查看不到数据的变化(数据库的值不变)。
这么做的意义为,如果B加500成功,但A中途因某些原因要工作人员取消转账,这时A的钱还未减500。数据库的值为B加500,A不变。
这时,在工作人员取消转账之前,马上在ATM上取出这500,问题就来了。
4.持久性(Durability):
对于任意已提交事务,系统事务对数据库的改变不被丢失,即使数据库出现故障。
解释:
事务一旦完成,无法撤销。
示例:
ATM取钱,账户 -100,吐钞200,钱已经装兜里。这时的事务已经结束,无法撤销,怎么处理?
只能再做一次“补偿性事务”,把客户账户里的钱 -100。
上一篇: UUID在Java中的两种产生方式
下一篇: laB1