数据库事务入门

什么是事务?

事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。 不会存在部分执行的情况,比如转账等业务就需要通过事务来处理,以保证一致性

什么是DML?

数据操纵语言(Data Manipulation Language, DML),DML 操作是指对数据库中表记录的操作,以INSERT、UPDATE、DELETE 三种指令为核心

需求引入:

现有一转账业务,需要把1号用户的100块钱转到2号用户的账户, 那么就需要执行两条sql: update balance set money = money - 100 where id = 1; update balance set money = money + 100 where id = 2;

理想情况下这样是不会有问题的,但是假如出现了这样的情况: 第一条语句成功执行了,第二条失败了 那就会导致1号账户平白少了100块钱,而2号账户也没有收到,这是很严重的问题

所以我们需要有一种机制,能把一组sql语句(多为dml语句)作为一个不可分割的整体来执行,执行要么全成功,要么全失败,而不会出现部分成功的情况 ——这就是事务。

  • 事务和锁

当执行事务操作时(一组dml语句),mysql会在表上加锁,以防止其他用户修改表

  • mysql 事务相关的几个操作

指令 作用
start transaction 开始一个事务
savepoint 设置保存点
rollback to 回退事务
rollback 回退全部事务
commit 提交事务,使所有操作生效,无法回退

  • 事务的使用

-- 演示事务的操作

-- 1、创建一个测试表
CREATE TABLE tab05 (
		id INT,
		`name` VARCHAR(32)
)

-- 2、开始事务
START TRANSACTION;

-- 3、设置保存点a,名字可以自起
SAVEPOINT  a;

-- 4、进行一次dml操作
INSERT INTO tab05 VALUES(100,'tom');

-- 5、再设置一个保存点b
SAVEPOINT b;

-- 6、再进行一次dml操作
INSERT INTO tab05 VALUES(200,'jack');

SELECT * FROM tab05;

-- 7、回滚到b
ROLLBACK TO b; 
-- 查询可以发现jack已经不在了,数据库回到了保存点b时的状态
SELECT * FROM tab05;

-- 8、回滚到a
ROLLBACK TO a;
-- 查询可以发现jack和tom都不在了,数据库回到了保存点a时的状态
SELECT * FROM tab05;

-- 9、如果不指定回滚到哪个保存点,那么会回滚到整个事务开始的状态
ROLLBACK;


-- 10、commit 提交事务,会让整个事务结束,所有操作永久生效,无法回退,保存点被清除
COMMIT;
  • 回退事务

在介绍回退事务前,先介绍一下保存点savepoint,保存点是事务中的时间截点,用于记录事务状态,以便之后回退恢复,当事务结束(commit)时,会自动的删除该事务所定义的所有保存点,当执行回退事务时,可通过指定可以回退到指定的保存点。

  • 提交事务

使用commmit语句可以提交事务,事务提交后,会确认事务的变化、结束事务、删除保存点、释放锁、数据正式生效。事务结束后,其他会话[其他连接]可以查看到事务变化后的新数据。当事务未提交时,其他会话看到的都是事务前的状态

  • 事务细节

    1. 如果不开启事务,默认情况下,dml操作是自动提交的,不能回滚

    2. innodb存储引擎支持事务,myisam不支持

    3. 开启一个事务的方式有两种

      1. start transaction

      2. set autocommit = off

你可能感兴趣的:(编程之路,数据库,mysql,sql)