首页技术文章正文

什么是事务?什么是事务安全?

更新时间: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((结束))

总结:事务的目的就是为了保障连续操作的一致性,保证结果的完整性。事务的原理是通过将操作结果暂时保存在事务日志中,等所有操作的结果都是成功的,然后一并同步到数据表。


分享到:
在线咨询 我要报名
和我们在线交谈!