MySQL入门 TCL语言之十六:事务(事务的使用),mysql隔离级别,设置mysql的隔离级别

MySQL入门 TCL语言之十六:事务(事务的使用),mysql隔离级别,设置mysql的隔离级别

#TCL语言
/*
Transaction Control Language 事务控制语言

事务:事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是互相依赖的。而整个单独单元作为一个可分割的整体,如果单元中某条sql语句一旦执行失败或者产生错误,整个单元将会回滚。所有受到影响的数据将会返回到事务开始以前的状态。如果单元中的所有sql语句均执行成功,则事务被顺利执行。

简单来说就是
一个或一组sql语句组成的一个执行单元,这个执行单元要么全部执行,要么全部不执行。

要了解事务还需了解MySQL中的存储引擎

存储引擎
1、概念:在mysql的数据用各种不同的的技术存储在文件(或内存)中(又称表类型)
2、通过 show engines; 来查看mysql中支持的存储引擎
3、在mysql中用的最多的存储引擎有:innodb(默认),myisam,memory等,其中innodb支持事务,而myisam,memory不支持。

案例:转账

张三丰 1000
郭襄   1000

两条语句组成了一个单元
update 表 set 张三丰的余额=500 where name = '张三丰';
意外中断
update 表 set 郭襄的余额=1500 where name = '郭襄';

事务的特性:
ACID

原子性(Atomicity):一个事务不可再分割,要么都执行成功,要么都不执行
一致性(Consistency):一个事务的执行会使数据从一个一致状态切换到另一个一致状态
隔离性(Isolation):一个事务的执行不受其他事务的干扰(需根据隔离级别)
持久性(Durability):一个事务一旦提交,则会永久改变数据库的数据

事务的创建
隐式事务:事务没有明显的开启和结束的标志
比如insert、update、delete等语句

delete form 表 where id = 1; (一条语句就是一个事务)

显示事务:事务具有明显的开启和结束的标记
前提:必须显示自动提交功能为禁用
set autocommit = 0;#只对当前所在的查询有效

步骤1:开启事务
set autocommit = 0;
start transaction;#可选语句,可以省略

步骤2:编写事务中的sql语句(select insert update delete)
语句1;
语句2;
...

步骤3:结束事务
commit;提交事务
rollback;回滚事务

savepoint 节点名,设置保存点

开始事务的语句:
update 表 set 张三丰的余额=500 where name = '张三丰';
update 表 set 郭襄的余额=1500 where name = '郭襄';
结束事务的语句;

数据的隔离级别:
问题:对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
脏读:事务1读取了事务2已经被更新但还没有被提交的字段,若事务2回滚,事务1读取的内容就是临时且无效的。
不可重复读:事务1读取了一个字段,事务2更新了该字段,事务1再次读取的时候值就不同了。
幻读:事务1读取了一个字段,事务2在字段插入了一些新的行,事务1在读取的时候就会多出几行

数据库事务的隔离性:
数据库系统必须具有隔离并发运行各个事务的能力,使事务之间不会互相影响,避免各种并发问题,一个事务与其他事务隔离的程度称为隔离级别,隔离级别越高,数据一致性就越好,但并发性越弱。

数据库的四种事务隔离级别:

隔离级别描述

READ UNCOMMITTED

(读取未提交数据)

允许事务读取未被其他事务提交的变更,脏读、不可重复读和幻读的问题都会出现

READ COMMITTED

(读取已提交数据)

只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可重复读和幻读的问题仍然可能出现

REPEATABLE READ

(可重复读)

确保事务可以多次从一个字段中读取相同的值,在这个事务的持续时间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读的问题仍然可能存在
SERIALIZABLE(串行化)确保事务可以从一个表中读取相同的行,在这个事务的持续期间,禁止其他事务对该表执行插入,更新和删除操作。所有的并发问题都可以避免,但性能十分低下(一般不建议使用)

Oracle支持的两种事务隔离级别
READ COMMITTED,SERIALZABLE,Oracle默认的事务隔离级别为READ COMMITTED
MySQL 支持4种事务隔离级别,
默认的事务隔离级别为:EEPEATABLE READ

在mysql中设置隔离级别:
每启动一个mysql程序中,就会获得一个单独的数据库连接池,每个数据库连接都有一个全局变量@@tx_isolation,表示当前的隔离级别。
查看当前隔离级别:
select @@tx_isolation;
设置当前MySQL连接的隔离级别:
set session transaction isolation level read committed;
设置数据库系统的
全局的隔离级别(需重启数据服务):
set global transaction isolation level read serialzable;

:DDL或者DCL语句(自动提交,没有事务的概念)
*/
#查看自动提交会不会开启

SHOW VARIABLES LIKE 'autocommit';
SHOW ENGINES;#查看mysql支持的存储引擎

DROP TABLE IF EXISTS account;
CREATE TABLE account(
    id INT PRIMARY KEY AUTO_INCREMENT,
    usename VARCHAR(20),
    balance DOUBLE
);
INSERT INTO account(usename,balance)
VALUES('张无忌',1000),('赵敏',1000);
#事务使用演示

#开启事务
SET autocommit = 0;
START TRANSACTION;
#编写一组事务的语句
UPDATE account SET balance = 500 WHERE usename = '张无忌';
UPDATE account SET balance = 1500 WHERE usename = '赵敏';

#结束事务
COMMIT;#或者rollback

SELECT * FROM account;

#2.演示事务对于delete和truncate的处理的区别
#特点:delete 可以回滚,而truncate不能回滚
SET autocommit=0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK;

SET autocommit=0;
START TRANSACTION;
TRUNCATE TABLE account;
ROLLBACK;
SELECT * FROM account;

#3.演示savepoint 的使用
SET autocommit = 0;
START TRANSACTION;
DELETE FROM account WHERE id =1;
SAVEPOINT a;#设置保存点
DELETE FROM account WHERE id =2;
ROLLBACK TO a;#回滚到保存点 a;

SELECT * FROM account;

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值