欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

事务处理

程序员文章站 2022-07-12 17:02:24
...

在计算机科学中,事务是无法被分割的操作,事务处理就是被分割为个体的信息处理。事务必须作为一个完整的单元成功或失败,不可能存在部分完成的事务。

例如,当你在网上书店购买了一本书,你用钱换了一本书(以信贷的方式)。如果你的信用是好的,一系列相关的操作会确保你拿到书并且书店会收到你的钱。然而,在交易时如果在那一系列操作中的单个操作执行失败,整个交易就会失败。你拿不到书,书店也不会收到你的钱。负责交易的平衡和可预测的技术就叫做事务处理。

*:事务处理


innoDB事务处理

前提:数据库引擎必须是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。
此时,A500,B加300。则转账失败。此为事务的一致性。

3.隔离性(Isolation):
事务的执行不受其它事务的影响,并发执行的几个事务,互不影响。事务执行的中间结果对其它事务必须是透明的(不可见)。

解释:
事务结束前,每一步操作带来的影响,别的会话看不见。

示例:
银行转账,A 转账给B 500元钱。
这时,B的钱加500成功,A的钱减少500成功,但在ATM上查看A和B的钱时,都是没有变的。

原因为事务的隔离性,在事务结束前(未执行commit),其他会话窗口(这里的ATM机)查看不到数据的变化(数据库的值不变)。

这么做的意义为,如果B加500成功,但A中途因某些原因要工作人员取消转账,这时A的钱还未减500。数据库的值为B加500A不变。
这时,在工作人员取消转账之前,马上在ATM上取出这500,问题就来了。

4.持久性(Durability):
对于任意已提交事务,系统事务对数据库的改变不被丢失,即使数据库出现故障。

解释:
事务一旦完成,无法撤销。

示例:
ATM取钱,账户 -100,吐钞200,钱已经装兜里。这时的事务已经结束,无法撤销,怎么处理?

只能再做一次“补偿性事务”,把客户账户里的钱 -100。