事务:
事务特征:
原子性:
不可再分,转账就是一个原子性操作,所有步骤全部成功或者全部失败
持久性:
转账成功,双方的金额会持久化的保存到存储设备中(数据库)
一致性:
转账之前和转账之后,数据总量不变,例如:张三向李四转账 500,转账之前(张三1000,李四1000),转账之后(张三500,李四1500)
隔离性:
事务A和事务B保持隔离
步骤:
1 开启事务
2 执行业务(此时是转账)
3 执行业务全部成功提交事务,否则回滚事务
-- 开启事务语法: start transaction;
-- 提交事务语法: commit;
-- 回滚事务语法: rollback; 只有出现异常状态(catch块)才会执行回滚的操作
事务隔离级别
创建表
create table tb_account(
id int(11) auto_increment,
account_name varchar(30) not null,
account_balance int(11) ,
primary key (id)
)default charset=utf8mb4,engine=INNODB;
insert into tb_account(account_name,account_balance)values('czq',1000),('jjm',1000);
使用事务来管理转账,好处一旦转账出现异常操作,立马回滚
-- 读未提交 读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。
-- 开始是 500 1500
-- set GLOBAL TRANSACTION ISOLATION LEVEL read UNCOMMITTED;
-- 读已提交 读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。
-- set global transaction isolation level read committed;
-- 可重复提交 重复读,就是在开始读取数据(事务开启)时,不再允许修改操作
-- 开始是 500 1500
set GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE read;
-- 2 开启事务
start transaction;
-- 3 执行转账
update tb_account set account_balance = account_balance-500 where id= 1;
-- 停电了
update tb_account set account_balance = account_balance+500 where id= 2;
-- 4 如果全部成功提交事务
commit;
打开另一个窗口
start transaction;
-- 执行select语句
select * from tb_account;