TCL事务

TCL

/*
Transaction Control Language 事务控制语言

事务:
一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
一旦执行失败或产生错误,整个单元将会回滚,所有受到影响的数据将返回到事物开始以前的状态。

案例:如果转账过程中出现意外,事务保证整个过程都不执行  
		
		转账500
		张三丰  1000
		郭襄	1000
		
		update 表 set 张三丰的余额=500 where name='张三丰'
		意外
		update 表 set 郭襄的余额=1500 where name='郭襄'

MySQL存储引擎:innodb支持事务,myisam、memory等不支持事务
              SHOW ENGINES;      #查看存储引擎

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

事务的创建:
	隐式事务:事务没有明显的开启和结束的标记
		  	  比如insert、update、delete语句
              SHOW VARIABLES LIKE 'autocommit';  #autocommit自动开启
	          delete from 表 where id =1;  #这就是一个事务

	显式事务:事务具有明显的开启和结束的标记
		     前提:必须先设置自动提交功能为禁用
	         set autocommit=0;   #针对当前事务有效
语法:
	步骤1:开启事务
		set autocommit=0; 
		start transaction; #上面的语句默认开启事务,这个语句可不写
	步骤2:编写事务中的sql语句(select insert update delete)即增删改查
		语句1;
		语句2;
		savepoint 节点名; 设置保存点
		...
	步骤3:结束事务
		commit;		 提交事务
		rollback;	 回滚事务
		rollback to 节点名;  回滚到指定地方

事务的隔离:对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时,
        如果没有采取必要的隔离机制, 就会导致各种并发问题:
	    脏读:一个事务读取了其他事务还没有提交的数据,读到的是其他事务“更新”的数据
	          对于两个事务T1 T2, T1 读取了已经被T2 更新但还没有被提交的字段. 
	          之后, 若T2 回滚, T1读取的内容就是临时且无效的.
	    不可重复读:一个事务多次读取,结果不一样
	              对于两个事务T1 T2, T1 读取了一个字段, 然后T2 更新了该字段. 
	              之后, T1再次读取同一个字段, 值就不同了.
	    幻读:一个事务读取了其他事务提交的数据,读到的是其他事务“插入”的数据
	         对于两个事务T1 T2, T1 从一个表中读取了一个字段, 然后T2 在该表中插入了一些新的行. 
	         之后, 如果T1 再次读取同一个表, 就会多出几行.
	  
数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.
		        
事务的隔离级别:一个事务与其他事务隔离的程度称为隔离级别.
			           脏读	 不可重复读	幻读
	【read uncommitted】√		√		√
	读未提交数据:允许事务读取未被其他事务提交的变更
	【read committed】  ×		√		√
	读已提交数据:只允许事务读取已被其他事务提交的变更
	【repeatable read】 ×		×		√
	可重复读:    确保事务可以多次从一个字段中读取相同的值,
				 在该事务持续期间,禁止其他事务对这个字段进行更新    
	【serializable】    ×        ×       ×
	串行化:      确保事务可以从一个表中读取相同的行
		         在该事务持续期间,禁止其他事务对该表执行插入、更新、删除
		         所有问题都能解决但性能低下

	mysql中默认 第三个隔离级别 repeatable read
	oracle中默认第二个隔离级别 read committed

	在cmd中进行如下操作:
	查看隔离级别
	select @@tx_isolation;
	设置隔离级别
	set session|global transaction isolation level 隔离级别;
    当前mySQL连接|全局的隔离级别
*/

1.演示事务的使用步骤

DROP TABLE IF EXISTS account;
CREATE TABLE account(
username VARCHAR(10),
balance INT
);
INSERT INTO account
VALUES('张无忌',1000),
('赵敏',1000);

#开启事务
	SET autocommit=0;
	START TRANSACTION;
#编写一组事务的语句
	UPDATE account SET balance = 500 WHERE username='张无忌';
	UPDATE account SET balance = 1500 WHERE username='赵敏';
#结束事务
	ROLLBACK;  #回滚
	#commit;   #提交

SELECT * FROM account;

2.演示事务对于delete和truncate的处理的区别

#演示delete,支持回滚
SET autocommit=0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK;

#演示truncate,不支持回滚
SET autocommit=0;
START TRANSACTION;
TRUNCATE TABLE account;
ROLLBACK;

3.演示savepoint 的使用

SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE username='张无忌';
SAVEPOINT a;        #设置保存点
DELETE FROM account WHERE username='赵敏';
ROLLBACK TO a;      #回滚到保存点,赵敏没有被删除,张无忌被删除
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值