一、概念
事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么不执行。
案例:转账
张三丰 1000
郭襄 1000
update 表 set 张三丰的余额=500 where name='张三丰';
update 表 set 郭襄的余额=1500 where name='郭襄';
这两条sql语句要么都执行,要么都不执行。
2. 事务的创建
隐式事务:事务没有明显的开启和结束的标记
比如insert、update、delete语句
显示事务:事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用。set autocommit=0;
步骤1:开启事务
set autocommit=0;
start transaction;(可选的)
步骤2:编写事务中的sql语句(select insert update delete)
语句1;
语句2;
……
步骤3:结束事务
commit;提交事务
rollback;回滚事务
演示事务的使用步骤:
#开启事务
SET autocommit=0;
START TRANSCATION;
#编写一组事务的语句
UPDATE account set balance=500 WHERE user_name='张无忌';
UPDATE account set balance=1500 WHERE user_name='赵敏';
#结束事务
COMMIT;
3. 数据库的隔离级别
MySQL8.0语句:
查看当前MySQL连接的隔离级别:
SELECT @@transaction_isolation;
设置当前MySQL连接的隔离级别:
set session transaction isolation level read committed;
(这里加了session会立刻更改,不加不会立刻更改,5.7和8.0都一样)
4. 设置保存点(回滚点,savepoint)
SET autocommit=0;
START TRANSCATION;
DELETE FROM account WHERE id=25;
SAVEPOINT a;#设置保存点
DELETE FROM account WHERE id=28;
ROLLBACK TO a;#回滚到保存点
可以看到25号删除了,28号没删除。
5. delete和truncate在事务使用时的区别?
演示delete
SET autocommit=0;
START TRANSACTION;
DELETE * FROM account;
ROLLBACK;
可以看到account中的数据并没有被删除
演示truncate
SET autocommit=0;
START TRANSACTION;
TRUNCATE TABLE account;
ROLLBACK;
可以看到account中的数据被删除了,说明truncate不支持回滚。