TCL事务控制

1. 事务概念

事务(Transaction):是由一个或多个SQL语句所组成的操作集合,这些SQL语句作为一个完整的工作单元,要么全部执行成功,要么全部执行失败。
在数据库中,通过事务来保证数据的一致性。比如:下面两条SQL语句模拟银行账户转账,对每个账户分别涉及到金额更新的操作,这两条操作只允许全部成功或全部失败,否则就会出现数据错误的现象。

UPDATE account SET money = money - 500 where id=1;
UPDATE account SET money = money + 500 where id=2;

2. 事务特征

事务的特征可采用ACID表示:

  • 原子性(Atomicity)
    事务就像“原子”一样,不可被分割,组成事务的DML操作语句要么全成功,要么全失败,不可能出现部分成功部分失败的情况。
  • 一致性(Consistency)
    一旦事务完成,不管是成功的,还是失败的,整个系统应处于数据一致的状态。
  • 隔离性(Isolation)
    一个事务的执行不会被另一个事务所干扰。
  • 持久性(Durability)
    也称为永久性,指事务一旦提交,对数据的改变就是永久的,不可以再被回滚。

3. 事务组成

在数据库中,事务由:
一组相关的DML,加上:
若干DQL语句(SELECT),再加上
一个TCL语句(COMMIT、ROLLBACK)或
一个DDL语句(CREATE、ALTER、DROP、TRUNCATE等)或
一个DCL语句(GRANT、REVOKE)组成。

例:如下SQL语句组成两个事务。

- INSERT. 		
- UPDATE. 		
- DELETE. 		
- SELECT. 		
- INSERT- COMMIT;--前6条语句,组成第1个事务 		
- UPDATE- DELETE. 		
- CREATE;--后3条语句,组成第2个事务

4. 事务控制

4.1 事务控制语言

事务控制语言(TCL):主要用来对组成事务的DML语句的操作结果进行确认或取消。
确认(提交):组成该事务的所有DML语句操作生效,使用COMMIT实现
取消(回滚):组成该事务的所有DML语句操作不生效,使用ROLLBACK实现

所有SQL操作都涉及到事务控制,默认情况下,在MySQL数据库中,事务被设置成自动提交状态,每执行一条SQL执行后MySQL就帮我们自动提交事务,因此如果想要手动控制事务,就必须通过如下命令关闭MySQL的事务自动提交。

SET autocommit = 0;   -- 0设置手动提交,1设置自动提交

这样就可以手动来控制事务是提交或者回滚了。在实际开发工作中,事务是一个非常重要的概念,一般情况下不会设置成自动提交。
也可以通过如下命令,来查看当前是否自动提交

SHOW VARIABLES LIKE  'autocommit';   
4.2 事务结束

事务结束有两种状态,分别是提交和回滚。同时有两种方式控制事务的结束,一种是显示方式,一种是隐式方式,具体见下表。

事务结束方式显示隐式
提交COMMIT执行一个DDL或者DCL语句
回滚ROLLBACK发生异常情况,如断网断电等
4.3 事务开启
方式1:上一个事务结束后,遇到的第一条DML语句,事务自动开启。
COMMIT;			//事务显示提交,当前事务结束
SELECT .....;		
INSERT INTO....;	//上一个事务结束后,遇到的第一个DML,自动开启
UPDATE ....;		
DELETE....;
SELECT ....;
INSERT ....;
CREATE;			//事务隐式提交,当前事务结束;	
UPDATE....;		//上一个事务结束后,遇到的第一个DML,自动开启
DELETE ..;
ROLLBACK;		//事务显示回滚,当前事务结束
方式2:通过BEGIN 或 START TRANSACTION 开启事务。
START TRANSACTION	//开启事务
INSERT INTO dept(deptno,dname,loc) 
VALUES(18, 'dept1','loc1');
SELECT * 
FROM dept;
//如上SQL执行完毕后,可以看到部门表中新插入一条编号为18的记录。
//继续执行如下SQL
ROLLBACK;
SELECT * 
FROM dept;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

周遭.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值