11、事务

130 阅读3分钟

11.1 模拟转账

生活当中转账是转账方账户扣钱,收账方账户加钱。我们用数据库操作来模拟现实转账。

11.1.1 数据库模拟转账
#A 账户转账给 B 账户 1000 元。
#A 账户减1000 元
UPDATE account SET MONEY = MONEY-1000 WHERE id=1;#B 账户加 1000 元
UPDATE account SET MONEY = MONEY+1000 WHERE id=2;
11.1.2 模拟转账错误
#A 账户转账给 B 账户 1000 元。
#A 账户减1000 元
UPDATE account SET MONEY = MONEY-1000 WHERE id=1;
#断电、异常、出错...#B 账户加 1000 元
UPDATE account SET MONEY = MONEY+1000 WHERE id=2;

11.2 事务的概念

事务是一个原子操作。是一个最小执行单元。可以由一个或多个SQL语句组成,在同一个事务当中,所有的SQL语句都成功执行时,整个事务成功,有一个SQL语句执行失败,整个事务都执行失败。

11.3 事务的边界

  • 开始:连接到数据库,执行:STRAT TRANSACTION; 即开启事务。然后输入DML操作
  • 结束:

    1). 提交:

    a. 显示提交:commit;

    b. 隐式提交:一条创建、删除的语句,正常退出(客户端退出连接);

    2). 回滚:

    a. 显示回滚:rollback;

    b. 隐式回滚:非正常退出(断电、宕机),执行了创建、删除的语句,但是失败了,会为这个无效的语句执行回滚。

11.4 事务的原理

数据库会为每一个客户端都维护一个空间独立的缓存区(回滚段),一个事务中所有的增删改语句的执行结果都会缓存在回滚段中,只有当事务中所有SQL 语句均正常结束(commit),才会将回滚段中的数据同步到数据库。否则无论因为哪种原因失败,整个事务将回滚(rollback)。

11.5 事务的特性

    表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败

    表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前状态

    事务查看数据操作时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。

    持久性事务完成之后,它对于系统的影响是永久性的。

11.6 事务应用

应用环境:基于增删改语句的操作结果(均返回操作后受影响的行数),可通过程序逻辑手动控制事务提交或回滚

11.6.1 事务完成转账
#A 账户给 B 账户转账。
#1.开启事务
START TRANSACTION;
#2.事务内数据操作语句
UPDATE ACCOUNT SET MONEY = MONEY-1000 WHERE ID = 1;
UPDATE ACCOUNT SET MONEY = MONEY+1000 WHERE ID = 2;
#3.事务内语句都成功了,执行 COMMIT;
COMMIT;
#4.事务内如果出现错误,执行 ROLLBACK;
ROLLBACK;