欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mysql中TCL事务控制语言

程序员文章站 2022-09-14 14:22:38
mysql中TCL事务控制语言#TCL/*Transaction Control Language 事务控制语言事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。案例:转账令狐冲 1000任盈盈 1000update 表 set 令狐冲的余额=500 where name='令狐冲'意外update 表 set 任盈盈的余......

mysql中TCL事务控制语言

#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;可选的,但是我个人强烈不建议省略
步骤2:编写事务中的sql语句(select insert update delete)
语句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='任盈盈'
结束事务的语句;

 

*/

#查看事务自动提交是否开启(on表示开启,off表示关闭)
SHOW VARIABLES LIKE 'autocommit';
#查看数据库支持的存储引擎
SHOW ENGINES;

/*
在mysql中用的最多的存储引擎有:innodb,myisam ,memory等
其中innodb支持事务,而myisam、memory等不支持事务
*/
DROP TABLE IF EXISTS account;
CREATE TABLE account(
    id INT PRIMARY KEY,
    aName VARCHAR(40),
    balance DOUBLE
);
DESC account;
INSERT INTO account VALUES(1, '令狐冲', 1000), (2, '任盈盈', 1000);
SELECT * FROM account;

#演示事务的使用步骤
SET autocommit=0; #开启事务
#下面这句话可省略,但是我个人强烈不建议省略
START TRANSACTION;#可省略,但是我个人强烈不建议省略
#编写一组事务的语句
UPDATE account SET balance = balance - 500 WHERE aName = '令狐冲';
UPDATE account SET balance = balance + 500 WHERE aName = '任盈盈';
#结束事务
#commit;#提交事务
ROLLBACK;#回滚事务
#
SELECT * FROM account;
/*

Mysql 支持 4 种事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ
Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE。 Oracle 默认的事务隔
离级别为: READ COMMITTED

*/
#
SHOW VARIABLES LIKE "%char%";

#查看当前的隔离级别
SELECT @@tx_isolation;

#事务的隔离级别
#设置当前 mySQL 连接的隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
#设置当前 mySQL 连接的隔离级别
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
#设置数据库系统的全局的隔离级别(需要重启一下mysql服务)
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;


#
#查看事务自动提交是否开启(on表示开启,off表示关闭)
SHOW VARIABLES LIKE 'autocommit';
#查看数据库支持的存储引擎
SHOW ENGINES;

#
SET autocommit=0;
#SET autocommit=1;
INSERT INTO account VALUES(9, '韦小宝', 1600);
SELECT * FROM account;
ROLLBACK;

SELECT * FROM account;

 

#演示savepoint 的使用,savepoint只能和ROLLBACK TO搭配使用,不能和commit搭配使用
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id = 2;
SAVEPOINT sp1;#设置保存点
DELETE FROM account WHERE id = 8;
SAVEPOINT sp2;#设置保存点
DELETE FROM account WHERE id = 7;
ROLLBACK TO sp2;#回滚到保存点
#
SELECT * FROM account;

#delete和truncate在事务使用时的区别

#演示delete
SET autocommit=0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK;

#演示truncate
SET autocommit=0;
START TRANSACTION;
TRUNCATE TABLE account;
ROLLBACK;

/*
truncate不支持事务,所以对于truncate,ROLLBACK关键字是无效的,
TRUNCATE TABLE 表名,这是DDL(数据定义语言),如果是DDL语句,会产生一个隐
式的提交(即自动提交)操作,所以,ROLLBACK对于DDL语句是无效的,这也就解
释了为什么truncate不支持ROLLBACK回滚

*/

#
SELECT * FROM account;

/*
MYSQL中的事务是默认自动提交的
SET AUTOCOMMIT语句可以禁用或启用默认的autocommit模式,用于当前连接
可以用SET来改变mysql的自动提交模式
SET autocommit=0   禁止自动提交
SET autocommit=1 开启自动提交

START TRANSACTION 开始一个事务
ROLLBACK   事务回滚
COMMIT       事务确认

注意当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直
到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了个新的事务!


事务提交有两种方式:显式提交和自动提交。
1.显式提交:使用commit。
2.自动提交:执行DDL或DCL,或者程序正常退出。


隐式提交的SQL语句
以下这些SQL语句会产生一个隐式的提交操作,即执行完这些语句后,会有一个隐式的COMMIT操作。
(1)DDL语句:ALTER DATABASE...UPGRADE DATA DIRECTORY NAME、....

(2)用来隐式的修改mysql架构的操作:CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE、SET PASSWORD。

(3)管理语句:ANALYZE TABLE、CACHE INDEX、CHECK TABLE、LOAD INDEX INTO CACHE、OPTIMIZE TABLE 、REPAIR TABLE。


数据库的事务语句组成
(1)一组DML(Data Manipulate Language,即数据操作语言)经过这组DML修改后数据将保持较好的一致性。

(2)一个DDL(Data Definition Language,即数据定义语言)语句。

(3)一个DCL(Data control Language,即数据控制语言)语句。

DDL和DCL语句最多只能有一个,因为DDL和DCL语句都会导致事务立即提交。

当事务所包含的全部数据库操作都成功执行后,应该提交(commit)事务,使这些修改永久生效。

#
以下情况的其中之一,可以作为事务的结束:
1.COMMIT 或 ROLLBACK 语句
2.DDL 或 DCL 语句(自动提交或者叫隐式提交)
3.用户会话正常结束
4.系统异常终了

*/

#
SELECT * FROM account;
INSERT INTO account VALUES(1, '令狐冲', 2600), (2, '韦小宝', 16800);
#
SHOW VARIABLES LIKE 'autocommit';

#(执行完后,效果是,account表中数据没有删掉了,ROLLBACK回滚有效,是因为设置了autocommit=0;)
SET autocommit=0;
START TRANSACTION;
#ALTER TABLE是DDL(数据定义语言),会默认提交/隐式提交
ALTER TABLE emp5 MODIFY COLUMN Last_name VARCHAR(60);
DELETE FROM account;
ROLLBACK;
#

 

#(执行完后,效果是,account表中数据删掉了,ROLLBACK回滚无效,是因为设置了autocommit=1;)
SET autocommit=1;
START TRANSACTION;
#ALTER TABLE是DDL(数据定义语言),会默认提交/隐式提交
ALTER TABLE emp5 MODIFY COLUMN Last_name VARCHAR(60);
DELETE FROM account;
ROLLBACK;
#

#(执行完后,效果是,account表中数据没有删掉了,ROLLBACK回滚有效,是因为后面设置了autocommit=0;)
SET autocommit=1;
START TRANSACTION;
#ALTER TABLE是DDL(数据定义语言),会默认提交/隐式提交
ALTER TABLE emp5 MODIFY COLUMN Last_name VARCHAR(60);
SET autocommit=0;
DELETE FROM account;
ROLLBACK;

 


#ROLLBACK回滚有效
SET autocommit=0;
DELETE FROM account;
ROLLBACK;
#

#ROLLBACK回滚有效
SET autocommit=0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK;
#

#
SELECT * FROM account;

#ROLLBACK回滚无效
SET autocommit=1;
DELETE FROM account;
ROLLBACK;
#


#ROLLBACK回滚有效
SET autocommit=1;
START TRANSACTION;#开启事务
DELETE FROM account;#语句
ROLLBACK;#结束事务
#


#
SHOW VARIABLES LIKE 'autocommit';

/*
不管把autocommit设置成0还是1,无所谓。只要是START TRANSACTION;语句开头,就表示事
务的开始,直到遇到ROLLBACK;或COMMIT;才表示该事务的结束
*/
#ROLLBACK回滚有效
START TRANSACTION; #开启事务
DELETE FROM account; #语句
DELETE FROM author; #语句
ROLLBACK; #结束事务
#

SELECT * FROM account;
SELECT * FROM author;

 

本文地址:https://blog.csdn.net/czh500/article/details/85965237