sql事务

本文介绍了SQL的基础操作,如创建账户表、插入数据、更新数据,并展示了事务的使用,包括查询事务提交方式、设置手动提交。接着,讨论了事务的四大特性,并通过实例展示了并发事务可能遇到的问题。最后,探讨了解决并发事务问题的事务隔离级别,通过实验验证了不同隔离级别对脏读、不可重复读和幻读的影响。
摘要由CSDN通过智能技术生成

一、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,这样就不会出现幻读

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值