更新时间:2023-02-23 来源:黑马程序员 浏览量:
计算机中的事务是指某个程序执行单元(写操作),事务安全是当事务执行后,保障事务的执行是有效的,而不会导致数据错乱。事务安全通常针对的是一连串操作(多个事务)而产生的统一结果。事务安全通常针对的是一连串操作(多个事务)而产生的统一结果。
MySQL中默认的写操作是直接写入的,可以执行写操作SQL,也可以同步到数据表。
例如银行转账,从A账户转账到B账户,创建数据表代码如下:
create table t_52( id int primary key auto_increment, name varchar(50) not null, account decimal(10,2) default 0.00 )charset utf8; insert into t_52 values(null,'Tom',10000),(null,'Lucy',100);
Tom向Lucy转账,一定是分为两步
# Tom扣钱 update t_52 set account = account - 1000 where id = 1; # Lucy收钱 update t_52 set account = account + 1000 where id = 2;
以上两步必须都成功转账才能叫成功,两步操作无法确保哪一步会出问题(尤其是第二步)。为了保障两步都成功才能叫事务安全。
事务安全是在操作前告知系统,接下来所有的操作都暂不同步到数据表,而是记录到事务日志,指导后续所有操作都成功,再进行同步;否则取消所有操作。
以上述转账为例
graph TB A(转账开始)-->B[开启事务] B-->C{事务1:Tom转出1000} C-->|成功|D[记录到事务日志] C-->|失败|G D-->E{事务2:Lucy转入1000} D-->|失败|G E-->|成功|F[记录到事务日志] F-->G[关闭事务<br>成功:提交事务 同步到数据表\清除事务日志<br>失败:回滚事务 清除事务日志] G-->H((结束))
事务安全是利用自动或者手动方式实现事务管理,事务安全包括以下几种类型:
自动事务处理:系统默认,操作结束直接同步到数据表(事务关闭状态)
系统控制:变量 autocommit(值为ON,自动提交)
手动事务处理的常见操作
开启事务: start transaction
关闭事务
提交事务:commit(同步到数据表同时清空日志数据)
回滚事务:rollback(清空日志数据)
事务回滚:在长事务执行中,可以在某个已经成功的节点处设置回滚点,后续回滚的话可以回到某个成功点
设置回滚点:savepoint 回滚点名字
回滚到回滚点:rollback to 回滚点名字
仍旧以手动事务中启用事务转账,成功提交事务为准,演示银行转账从A账户转账到B账户的过程。
创建数据表
create table t_52( id int primary key auto_increment, name varchar(50) not null, account decimal(10,2) default 0.00 )charset utf8; insert into t_52 values(null,'Tom',10000),(null,'Lucy',100);
转账:Tom向Lucy转账,一定是分为两步
# Tom扣钱 update t_52 set account = account - 1000 where id = 1; # Lucy收钱 update t_52 set account = account + 1000 where id = 2;
事务安全是在操作前告知系统,接下来所有的操作都暂不同步到数据表,而是记录到事务日志,指导后续所有操作都成功,再进行同步;否则取消所有操作
graph TB A(转账开始)-->B[开启事务] B-->C{事务1:Tom转出1000} C-->|成功|D[记录到事务日志] C-->|失败|G D-->E{事务2:Lucy转入1000} D-->|失败|G E-->|成功|F[记录到事务日志] F-->G[关闭事务<br>成功:提交事务 同步到数据表\清除事务日志<br>失败:回滚事务 清除事务日志] G-->H((结束))
总结:事务的目的就是为了保障连续操作的一致性,保证结果的完整性。事务的原理是通过将操作结果暂时保存在事务日志中,等所有操作的结果都是成功的,然后一并同步到数据表。