sql事务-1

sql事务

--每一条sql就是一个事务

案例-建表语句

create table account (
    id int auto_increment primary key comment 'id',
    name varchar(10) comment '姓名',
    money int comment '余额'
);
-- 添加数据
insert into account (id, name, money) values (null,'张三',2000), (null ,'李四',2000);

-- 恢复数据
update account set money = 2000 where name = '张三' or name = '李四';

========= 转账操作案例

--需要事务的场景-------张三往李四转账,进行到步骤3时报错,但是步骤2已经执行

--导致张三钱已经减少但是李四钱未增加

-- 1.查询张三得账户余额
select * from account where name = '张三';

-- 2 将张三余额-1000
update account set money = money - 1000 where name = '张三';

-- 3 将李四账户余额+1000
update account set money = money + 1000 where name = '李四';

sql事务-1_第1张图片

执行  (仔细看会发现第三步where应为中文,变为了一行错误代码)

sql事务-1_第2张图片

结果

sql事务-1_第3张图片

解决方法是

把转账操作控制在一个事务范围之类

sql事务操作

--Sql的事务默认是自动提交

查看/设置事务提交方式--设置事务的提交方式

Select  @@autocommit; -- 查询事务的自动提交方式  1 自动  0手动

Set @@autocommit = 0 ;-- 设置为手动

提交事务

Commit;

回滚事务

Rollback;

--------------------------------

开启事务

Start TRANSACTION或者 BEGIN

提交事务

Commit;

回滚事务

Rollback;

-- 转账操作案例

--开启事务-----开启之后,后面sql语句执行后不会自动保存需要手动回滚或保存结束事务
start transaction;


-- 1.查询张三得账户余额
select * from account where name = '张三';

-- 2 将张三余额-1000
update account set money = money - 1000 where name = '张三';


程序抛出异常...

-- 3 将李四账户余额+1000

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

--Commit;

-- Rollback;

事务的四大特性

sql事务-1_第4张图片

并发事务问题

sql事务-1_第5张图片

脏读

sql事务-1_第6张图片

不可重复读

sql事务-1_第7张图片

幻读

sql事务-1_第8张图片

事务隔离级别---解决并发事务引发的问题

sql事务-1_第9张图片

✔为会出现

从事往下隔离级别递增,性能递减

查看事务的隔离级别

SELECT @@TRANSACTION_ISOLATION;

设置事务隔离级别

session --会话级别--当前客户端窗口有效

global --所有客户端窗口有效

SET[ session | global ] TRANSACTION ISOLATION LEVEL Serializable

你可能感兴趣的:(数据库,sql,mysql)