Java登陆第七天——SQL之事务

发布时间 2023-11-15 17:58:20作者: ocraft

事务

在日常生活中,事务就是一件件要做的事情。

在数据库中,事务指的是一条条SQL语句。

事务的功能

事务用于保证数据的一致性,它由一组DML语句组成。

该组DML语句要么全部成功,要么全部失败。

image
事务就是为了解决上述问题。

事务的解释

image
如果直接回到记录点A。A后的记录点都会被删除。

当执行事务操作时,mysql会在表上加锁,防止其他会话(用户)更改表的数据。
会话:实际开发中,数据库会有多个用户进行连接。一个用户称为一个会话。

事务操作

--开始一个事务。
start transaction;

--设置记录点。
savepoint 记录点名;

--回滚到一个记录点。
rollback to 记录点名;

--回滚全部事务。(也就是回到事务开始之时)
rollback;

--提交事务。(所有操作生效,无法进行回滚操作)
commit;

栗子:新建一个表money,并开始一个事务
设置记录点A
插入数据(1001,'张三',2000)
插入数据(1002,'李四',2000)
设置记录点B
张三给李四转账1000
设置记录点C
查看表money

SQL语句:

create table money (
id int primary key,
name varchar(32),
balance int
);

start transaction;
savepoint A;

insert into money values (1001,'张三',2000);
insert into money values (1002,'李四',2000);
savepoint B;

update money set balance = balance - 1000 where id = 1001;
update money set balance = balance + 1000 where id = 1002;

savepoint C;

select * from money;

程序运行结果:
image
注意此时事务没有提交。数据并没有生效

在上述栗子的基础上:
张三和李四吵架了,又不想转账了(回滚到记录点B)
再查看money表

SQL语句:

rollback to B;

select * from money;

程序运行结果:
image

倒闭了,张三李四都不想玩了。(回滚全部事务)
再查看money表

SQL语句:

rollback;

select * from money;

程序运行结果:
image

测试能否从最初回到记录点B

SQL语句:

rollback to B;

程序运行结果:
image
回滚到事务开始之时,B记录点已被删除。

提交事务,让money表空着去吧
再查看money表

SQL语句:

commit;

select * from money;

程序运行结果:
image