SQL(7)TCL 事务控制语言 特点+演示+隔离级别+save point

第一部分的内容:

SQL(2)DQL语言 条件查询+排序查询+常见函数+分组查询+连接查询

https://blog.csdn.net/Lee_Yu_Rui/article/details/107527594

SQL(3)DQL语言 子查询+分页查询+联合查询

https://blog.csdn.net/Lee_Yu_Rui/article/details/107566293

SQL(4)DML语言 增删改

https://blog.csdn.net/Lee_Yu_Rui/article/details/107584843

SQL(5) DDL语言 库和表的创建,修改和删除

https://blog.csdn.net/Lee_Yu_Rui/article/details/107598414

SQL(6) 数据的常见约束和标识项

https://blog.csdn.net/Lee_Yu_Rui/article/details/107603411

感谢以下链接的教学分享,很好的视频和资源,笔记记录在这里,便于日后查看

新i版-链接: https://pan.baidu.com/s/1GDhRzV_3lUQaETsH4CM8zQ 提取码: rpte

TCL

/*
Transaction control language 事务控制语言

事务:
一个或一组sql语句组成一个执行单元,要么全部执行,要不全部不执行
特点:【经典面试题】
    ACID
    Atomicity   原子性:事务是一个不可再分的工作单位
    Consistency 一致性:一个事务的执行会使数据从一个一致状态切换到另一个一致状态
    Isolation   隔离性:一个事务的执行不能受到其他事务的干扰(还是受到隔离级别的影响)
    Durability  持久性:一个事务提交,它对数据库中的数据的改变就是永久性的
案例:转账   避免中途失败 导致一个人钱转账出去,另一个人没有收到


事务的创建
1.隐式事务: 事务没有明显的开启和结束的标记  insert update delete 
           通过以下可以查询,mysql是默认开启的自动提交
           SHOW VARIABLES LIKE 'autocommit'

2.显示事务: 事务具有明显的开始和结束的标记
       前提:必须先设置,自动提交功能禁用
       set autocommit = 0  仅针对当前对话有效
       步骤1: 开启事务
        set autocommit = 0;
        start Transaction;可选
       步骤2:编写事务中sql语句(select,insert,update,delete 注意 ddl没有事务之说)
       
       步骤3:结束事务
       commit;提交事务
       rollback;回滚事务

*/
SHOW ENGINES;
#innodb 是支持事务的
SHOW VARIABLES LIKE 'autocommit'


SHOW VARIABLES LIKE'%AUTO_INCREMENT%'
SET auto_increment_increment = 1
USE test
DROP TABLE IF EXISTS account;
CREATE TABLE account(
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20),
    balance DOUBLE

);
INSERT INTO account VALUES(NULL,'张无忌',1000),(NULL,'赵敏',1000)
SELECT * FROM account

演示事务

#步骤1: 开启事务
SET autocommit = 0;
START TRANSACTION;
#步骤2:编写事务中sql语句(select,insert,update,delete 注意 ddl没有事务之说)
UPDATE account SET balance = 1000 WHERE username = '张无忌';
UPDATE account SET balance = 1000 WHERE username = '赵敏';
       
#步骤3:结束事务(可以认为上述结果只是临时的,并没有进入内存) 通过结束事务的命令 才能保存数据或者保持原态
#commit;
ROLLBACK;

SELECT * FROM account

 隔离级别   

并发问题:多个事务同时操作同一个数据库的相同数据

/*
在命令行的操作
select @@tx_isolation;  产看隔离级别
set session tranction isolation level read committed; 针对当前mysql连接的隔离级别

set gobal  tranction isolation level read committed; 针对数据里系统全局的隔离级别

事务的隔离级别:
                                               脏读,         不可重复读      幻读,
read uncommitted:                  ×                   ×                    ×
read committed :                     √                    ×                    ×

repeatable read                        √                  √                    ×  (mysql默认)
serializable                               √                 √                     √   效率很低
*/

并发问题脏读,不可重复读和幻读的理解

脏读:一个事务A执行过程中(还没有结束),对数据进行更新;此时事务B读取到了数据,就是更新后的数据,若此时A的结束内容是回滚,表示返回了,不执行这个更新操作了。但此时事务B已经读到了错的数据,这就是脏读

不可重复读:一个事务B先读取了事务A的字段。然后A更新了字段,B又读了字段,就变成了更新的字段,两次读取的结果不一样,就是不可重复读(同一事物B中两次查询结果不一样)。这是部队的,在事物B建立的时候A的状态,应该在整个B事物中保持不变,什么时候事物B能读到新的数据呢?就是事物C先A更改之后在创建。

幻读:对于事物A,在T1表格中读取了数据,想将数据(假设一共2个数据)更改一下,但此时突然有事出去一下,可能停了一会,这时候 另外一个人 创建了事物B  向表中插入了一个新的数据,并提交了。然后此时A事物的人回来了,执行了更新数据的命令,发现哎?怎么结果显示3行受影响,明明我刚刚查看的数据只有两行啊?(这种因为插入数据导致的成为幻读)

回滚点 savepoint

/*
savepoint 回滚点名
搭配 roolback to 归滚点名 使用
含义:回滚到指定的位置
*/

SET autocommit = 0;

DELETE FROM account WHERE id = 1;
SAVEPOINT a; #设置保存点
DELETE FROM account WHERE id = 2;
ROLLBACK TO a;

delete and truncate在事务使用时的区别

# delete

SET autocommit = 0;
DELETE FROM account;
ROLLBACK;

SELECT * FROM account

# truncate

SET autocommit = 0;
TRUNCATE TABLE account;
ROLLBACK;

SELECT * FROM account

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lee_Yu_Rui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值