一、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,分别开启事务,执行语句即通过等以下类似操作,看效果,验证不同事务级别所解决或存在的问题:
设置事务隔离级别:set session transaction isolation level read committed;
- 开启事务: start transaction;
- 查询数据库表:select * from account;
- 插入数据库表: insert into account(id,name,money) values(3,'王五',2000);
- 事务2更新数据库表:update account set money = money - 1000 where name = '张三';
- 提交事务: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 后查看