sql事务

发布于:2023-01-07 ⋅ 阅读:(181) ⋅ 点赞:(0)

一、sql简介


---转账操作为例

create table account(
id int auto_increment primary key comment '主键ID',
name varchar(10) comment '姓名',
money int comment '余额'
) comment '账户表';

insert into account(id,name, money) VALUES (null, '张三',2000),(null,'李四',2000);

update account set money = 2000 where name ='张三' or name = '李四';



--查询事务提交方式,默认是0,自动提交
select @@autocommit;

--设置事务提交方式,设为1是手动提交
set @@autocommit = 1;


select * from account where name = '张三';


update account set money = money -  1000 where name = '张三';


update account set money = money +  1000 where name = '李四';

commit

rollback

 二、事务特性

三 、并发事务问题

start TRANSACTION
select * from account where name = '张三';


update account set money = money -  1000 where name = '张三';

update account set money = money +  1000 where name = '李四';


commit

ROLLBACK

 

 四、解决并发事务问题方式-事务隔离级别

 

 通过实验,验证事务隔离级别解决问题,可以启动两个cmd,分别开启事务,执行语句即通过等以下类似操作,看效果,验证不同事务级别所解决或存在的问题:

  1. 设置事务隔离级别:set session transaction isolation level read committed;

  2. 开启事务: start transaction;
  3. 查询数据库表:select * from account;
  4. 插入数据库表: insert into account(id,name,money) values(3,'王五',2000);
  5. 事务2更新数据库表:update account set money = money - 1000 where name = '张三';
  6. 提交事务:commit;

最终验证假设:

隔离级别 脏读 不可重复度 幻读 解释说明

read uncommitted

(读取未提交)

事务1读取到了事务2 commit之前的数据

read commited

(读取已提交)

事务1读取不到事务2commit之前的数据;

但读取到了事务2commit之后的数据

repeatable read

(可重复读)

事务1select时,显示id=3的不存在,但是插入id=3时,又报主键冲突的错误,出现了幻读(这是因为事务2在insert之前,插入了id为3的值,并提交了)

serializable

(串行化)

事务1在开启过程中,事务2无法insert,这样就不会出现幻读

 

 

 

 

 

本文含有隐藏内容,请 开通VIP 后查看