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 = '李四';

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

结果

解决方法是
把转账操作控制在一个事务范围之类
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;
事务的四大特性

并发事务问题

脏读

不可重复读

幻读

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

✔为会出现
从事往下隔离级别递增,性能递减
查看事务的隔离级别
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别
session --会话级别--当前客户端窗口有效
global --所有客户端窗口有效
SET[ session | global ] TRANSACTION ISOLATION LEVEL Serializable