数据库之事务详解

TCL语言

TCL(Transaction Concrol Language),事务控制语言。

事务

由一条或一组SQL语句组成一个执行单元;
特点(ACID):

  1. 原子性(atomicity),一个事务是一个不可分割的工作单位,事务中的操作要么都执行成功,要么都执行失败。
  2. 一致性(consistency),事务必须是使数据从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  3. 隔离性(isolation),一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  4. 持久性(durability),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

事务的创建

隐式事务:事务没有明显的开启和结束的标记。例如DELETE,INSERT,UPDATA语句。
显示事务:事务具有明显的开启和结束的标记。

  1. 将事务自动提交功能禁用;
  2. 开启事务
  3. 执行成功提交事务,失败回滚事务;

语法格式:

SET AUTOCIMMIT=0;#关闭自动提交功能
START TRANSACTION;#开启事务,可以不写,关闭自动提交功能后默认开启事务
SQL语句;#执行事务中的SQL语句
成功提交事务:COMMIT;
失败回滚事务:ROLLBACK;

事务并发问题

  • 脏读:对于两个事务A和B,事务A读取了事务B更新了但是还没有提交的数据,之后,若B回滚,那么A读取的就是无效的。读取未提交数据
  • 不可重复读:对于两个事务A和B,事务A读取了一条记录,然后B更新了该条记录,之后,A再去读取这条记录,但是值却不一样了。前后多次读取,数据内容不一致
  • 幻读:对于两个事务A和B,A先从表中读取了多条记录,然后B在这个表中插入了Y条记录,当A再次以同样条件在这个表中读取数据时,却比上次读取多出了几条记录。前后多次读取,数据总量不一致

事务隔离级别

事务与事务隔离的程度称为隔离级别。

  1. READ UNCOMMITTED(读未提交),允许事务读取未被其他事务提交的数据,脏读,不可重复读,幻读的问题都可能会出现。但是数据库隔离级别一般起步就是二档。

  2. READ COMMITTED(读已提交),只允许事务读取被其他事务提交的数据,解决了脏读问题,但是不可重复的和幻读问题仍可能出现。oracle默认隔离级别;

  3. REPEATABLE READ(可重复读),确保事务可以在一个字段读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读问题,但是幻读问题还是可能出现。MySQL默认隔离级别.

  4. SERIALIZABLE(串行化),确保一个事务可以从一个表中读取相同的行,在这个事务进行期间,禁止其他事务对该表进行增删改等操作,所有并发问题都可避免,但是性能较低。

查看当前隔离级别:

SELECT @@tx_isolation;

设置隔离级别:

#设置当前会话(比如打开窗口,到关闭就是一次会话)隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别;
#设置全局隔离级别(再创建其它会话都会是这个隔离级别)
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;

回滚点SAVEPOINT和ROLLBACK TO:
事务执行失败可以回滚到回滚点;

SET AUTOCOMMIT=0;
SQL语句 1;
SAVEPOINT a;
SQL语句 2;
ROLLBACK TO a;

如果事务执行失败,可以回滚到回滚点a处,SQL语句1造成的后果不可回滚,SQL语句2造成的后果可以回滚;


版权声明:本文为weixin_53285159原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。