事务操作

事务的概念

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

事务的边界

  • 开始:连接到数据库,执行一条DML语句。 上一个事务结束后,又输入了一条DML语句,即事务的开始;
  • 结束:
  1. 提交:
    显示提交:COMMIT;
    隐式提交:一条DML语句。正常退出(客户端退出链接);
  2. 回滚:
    显示回滚:ROLLBACK;
    隐式回滚:非正常退出,执行了创建、删除的语句,但是失败,会为这个无效的SQL语句执行回滚;

事务的原理

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

事务的四大特性

  • Atomicity(原子性)
    表示的是一个事务内的所有操作是一个整体,要么全部成功,要么全部失败;
  • Consistency(一致性)
    表示一个事务内有一个操作失败时,所有的更改过得数据都必须回滚到修改前状态;
  • Isolation(隔离性)
    事务查看数据操作时数据所处的状态,要么是另一个并发事务修改数据之前的状态,要么是另一个并发事务修改它之后的状态。事务不会查看中间状态的数据;
  • Durability(持久性)
    事务完成之后,对于数据库的影响是永久性的;

运用事务完成转账操作

#事务-------------------------------
CREATE TABLE account(
	id INT,
	money INT 
)CHARSET = utf8;
INSERT INTO account(id,money) VALUES(1,10000);
INSERT INTO account(id,money) VALUES(2,1000);
SELECT * FROM account;
#1账号转钱给2账户1000元
#开启事务
START TRANSACTION; #方式1 开启一个事务
SET autoCommit = 0;#方式2 设置自动提交为0:关闭自动提交; 1:开启自动提交
#原子操作
#1账户扣钱
UPDATE account SET money = money - 1000 WHERE id = 1;

#2账户加钱
UPDATE account SET money = money + 1000 WHERE id = 2;
#执行提交 ---成功
COMMIT;
#执行回滚 ---失败
ROLLBACK;
  • 开启事务后,在当前事务内执行的语句均属于当前事务,成功再执行COMMIT,失败要进行ROLLBACK;