事务处理语言TPL(Transaction Process Language)
1、事务?什么叫事务?
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。
可能这样解释还不是能够很好的理解事务,接下来看一个生活中的例子:
2、与"钱"有关的事务
我们经常做的就是转账 -_-
思考一下转账包括那几个核心的步骤 ?
1、转账账户扣钱
2、收账方账户加钱
MySQL模拟如下:
A 账户减掉1000元
update account set money = money -1000 where name = 'A';
B账户加钱 1000元
update account set money = money + 1000 where name = 'B';
假设在A账户减钱后,程序出现了异常,那B账户还会执行加钱操作吗?
如果B不执行,那么A账户减钱,这样就会导致用户财产损失;
如果A并没有执行成功,而B执行成功了?A的钱并没有减少,而B平白增加了钱,则银行不干了。
这个过程分成两步,每一个也都是一个事务,
但是对于转账这一个单独的事务来说,是由两个更小的事务构成的,
两个事务的执行成功,才会导致它的执行成功
3、再次理解事务的概念
- 事务是一个原子操作,是一个最小执行单元,由一个或多个SQL语句组成。
- 在同一个事务中,所有的SQL语句都执行成功时,整个事务才会成功。
- 有一个SQL语句执行失败,整个事务都执行失败。
- 每条SQL语句都是一个独立的操作,一个操作对数据库是永久的影响。
4、事务的原理:
数据库会为每一个客户端都维护一个空间独立的缓冲区(回滚段)。
一个事务中所有的增删改语句的执行结果都会缓存在回滚段中。
当事务中所有的SQL语句均正常结束(commit),才会将回滚段中的数据同步到数据库。
否则无论因为那种原因失败,整个事务将回滚(rollback)。
[
(缓冲区)可以简单理解为打游戏实时记录的蓝本存档,
(回滚)比如打到某个关卡突然过不去,需要回到某个时间存档点,
(提交)通关之后,游戏就结束了。
]
5、事务的边界
1、开始
隐式开启:
连接到数据库,执行一条DML语句,上一条事务结束后,又输入了一条DML语句,即事务的开始。
默认:每条语句都是一个事务,不需要手动开启,结束也不需要手动提交。
显示开启:
若要想多条语句共同构成一个事务
我们需要自己开启一个事务:Start transaction;显示开启事务,执行结束得手动提交。
2、结束
隐式提交:一条DML语句执行完,正常提交(客户端退出连接)
显示提交:COMMIT;
3、回滚:
隐式回滚:
非正常退出(断电、宕机);
执行了创建、删除的语句,但是失败了,会为这个无效的语句执行回滚。
显示回滚:ROLLBACK;
6、事务的特性
1、Atomicity(原子性)
表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败。
2、Consistency(一致性)
表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前的状态。
3、Isolation(隔离性)
事务查看数据操作时数据所处的状态,要么是另一并发事务修改它之前的状态;
要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
4、Durability(持久性)
持久性事务完成之后,它对于系统的影响是永久性的。
7、事务的应用
基于增删改语句的操作结果,可通过程序逻辑手动控制事务提交或回滚
应用事务完成转账:
1、开启事务:
方式一:Start Transaction;
方式二:setautocommit=0;#禁止自动提交 setautocommit=1;#开启自动提交
2、事务内数据操作语句
3、结束
事务内语句都执行成功:提交:Commit
事务内如果出现错误,回滚:Rollback;