134-138事务
#TCL /* Transaction Control Language 事务控制语言 事务: 一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。 案例:转账 张三丰 1000 郭襄 1000 update 表 set 张三丰的余额=500 where name='张三丰' 意外 update 表 set 郭襄的余额=1500 where name='郭襄' 事务的特性: ACID 原子性:一个事务不可再分割,要么都执行要么都不执行 一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态 隔离性:一个事务的执行不受其他事务的干扰 持久性:一个事务一旦提交,则会永久的改变数据库的数据. 事务的创建 隐式事务:事务没有明显的开启和结束的标记 比如insert、update、delete语句 delete from 表 where id =1; 显式事务:事务具有明显的开启和结束的标记 前提:必须先设置自动提交功能为禁用 set autocommit=0; #这个关闭只针对当前事务有效。并不是关一次就永远生效 步骤1:开启事务 set autocommit=0; start transaction;可选的,只要写上set autocommit=0;就算默认开启事务了 步骤2:编写事务中的sql语句(select insert update delete)。create、drop、alter这些属于DDL语言,它没有事务一说 语句1; 语句2; ... 步骤3:结束事务 commit;提交事务 rollback;回滚事务 savepoint 节点名;设置保存点 事务的隔离级别: 脏读 不可重复读 幻读 read uncommitted:√ √ √ read committed: × √ √ repeatable read: × × √ serializable × × × mysql中默认 第三个隔离级别 repeatable read oracle中默认第二个隔离级别 read committed 查看隔离级别 select @@tx_isolation; 设置隔离级别 set session|global transaction isolation level 隔离级别; 开启事务的语句; update 表 set 张三丰的余额=500 where name='张三丰' update 表 set 郭襄的余额=1500 where name='郭襄' 结束事务的语句; */ SHOW VARIABLES LIKE 'autocommit'; SHOW ENGINES; #1.演示事务的使用步骤 #开启事务 SET autocommit=0; START TRANSACTION; #编写一组事务的语句 UPDATE account SET balance = 1000 WHERE username='张无忌'; UPDATE account SET balance = 1000 WHERE username='赵敏'; #结束事务 ROLLBACK; #commit; SELECT * FROM account; #2.演示事务对于delete和truncate的处理的区别 SET autocommit=0; START TRANSACTION; DELETE FROM account; ROLLBACK; #3.演示savepoint 的使用 SET autocommit=0; START TRANSACTION; DELETE FROM account WHERE id=25; SAVEPOINT a;#设置保存点。保存点只搭配ROLLBACK使用 DELETE FROM account WHERE id=28; ROLLBACK TO a;#回滚到保存点 SELECT * FROM account; #演示事务的隔离级别 ①查询当前默认隔离级别: 老版本:select @@tx_isolation;select GLOBAL tx_isolation; mysql8.0:select @@transaction_isolation; 图 ②修改事务的隔离级别 set session transaction isolation level read uncommitted; #将隔离级别设置为:'READ-UNCOMMIT' 图 修改后的隔离级别:图