TCL事物控制语言
程序员文章站
2022-07-05 13:22:55
...
#TCL (transaction control language)事物控制语言
/*
事物:一个或一组sql语句组成的一个执行单元,这个执行单元要么全部执行,要么全部不执行
事物的特点:(ACID)
1、原子性(atomicity):一个事物不可再分割,都执行或都不执行
2、一致性(consistency):一个事物会使数据从一个一致状态切换到另一个一致状态(没有中间商赚差价)
3、独立性(isolation):一个事物的执行不受其他事物的干扰(由设置的级别决定)
4、持久性(durability):事物一旦执行,会永久改变数据,不可撤回
事物的创建:
隐式事物:事物没有明显的开启和结束的标志
如update,insert,delect语句(默认一个语句为一个事物)
显式事物:有明显的开启和结束的标志
前提:设置自动提交功能为禁用 set autocmmit=0;
创建事物的步骤:
step1、开启事物
set autocmmit=0; #关闭自动提交功能
【start transaction;】 #可不写,关闭自动提交功能默认开启事物
step2、编写事物中的SQL语句(select,update,delect,insert)
。。。
。。。
step3、结束事物
commit; #提交事物---结束方式1
rollback; #回滚事物---结束方式2
事物隔离的级别:
脏读 不可重复度 幻读
read uncommitted: 出现 出现 出现
read committed: \ 出现 出现
repeatable read: \ \ 出现
serializable: \ \ \
1、MySQL默认第三隔离级别 repeatable read
oracle默认第二隔离级别 read committed
2、查看隔离级别的语句 select @@tx_isolation;
3、设置隔离级别的语句(当前或全局) set session|global transction isolation level 隔离级别;
*/
SHOW ENGINES; #显示存储引擎
SHOW VARIABLES LIKE 'autocom`student`mit'; #查看自动提交状态是否开启
SET autocommit=0; #设置自动提交状态关闭
-- -----------------------------------------------------------
#新建数据表插入数据
DROP TABLE IF EXISTS account;
CREATE TABLE IF NOT EXISTS account(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20),
balance DOUBLE
);
INSERT INTO account (username,balance) VALUES('老板','10000'),('我','10000');
SELECT * FROM account;
-- -------------------------------------------------
#1、演示事物使用步骤
#1、开启事物
SET autocommit=0;
START TRANSACTION;
#2、编写事物语句
UPDATE account SET balance=10000 WHERE username='我';
UPDATE account SET balance=10000 WHERE username='老板';
#3、提交事物
COMMIT;
-- rollback; #就是执行不完又回到执行前的样子了
-- -------------------------------------------------
#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的使用(设置保存点,和rollback配合使用)
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=1;
SAVEPOINT a; #设置保存点
DELETE FROM account WHERE id=2;
ROLLBACK TO a; #回滚到保存点(保存点之前的执行完了,之后的没执行)
SELECT * FROM account;