事务孤立级别

控制 中简单介绍了在集算器中,如何控制事务的提交与回滚。在这一节中将更详细地讨论不同事务孤立级别下,数据库事务的执行情况。

SQL 的四类语言

SQL是指结构化查询语言(Structured Query Language),就功能而言,又可以分为以下四个种类:

 

(1) 数据库定义语言DDLData Definition Language

(2) 数据操纵语言DMLData Manipulation Language

(3) 数据库控制语言DCLData Control Language

(4) 事务控制语言TCLTransaction Control Language

其中,数据库定义语言DDL是指有关数据库定义和描述的语言,可以增删或修改数据库、表、索引等,如create database, drop table等。DDL会影响到数据库的定义,因此在一些安全需求较高的项目中,有可能需要禁用。

数据操纵语言中,也包括数据查询语言DQLData Quary Language),是指对数据库中的数据执行查询修改等操作的语言,如select, insert, delete, update等,都属于DML,这些是访问数据库查询数据时使用最多的各类语言。

数据库控制语言是指设置或更改数据库用户权限的语句,如grant, deny, revoke等,在集算器的使用中,DCL基本不会用到。

事务控制语言是指维护数据库事务的语言,包括savepoint, rollback, commit等,在集算器中TCL是通过相应的函数来实现的。

事务孤立级别

事务孤立级别,也称为事务隔离级别,是指在多个事务同时存在,并都有可能改变数据库中的数据时,事务内外对数据访问的状态。在集算器中,事务是指在同一个数据库连接中所执行的SQL语言。

一般情况下,只有事务中执行TCL时才会执行把数据提交到数据库或回滚等操作。但是,当事务中执行DDL时,实际上相当于在事务中执行了提交,会把当前未保存的数据存储到数据库中。如执行了一条create table的语句,在数据库中添加了一个新表,此时就相当于执行了一次commit操作。

 

事务孤立级别可以分为以下四个等级:

(1) 读取提交内容(Read Committed)。这是大多数数据库默认的事务孤立级别,一个事务只能看到已经提交的改变。

(2) 读取未提交内容(Read Uncommitted)。在这种孤立级别下,所有事务都能看到其它事务未提交的执行结果。这种状况下,事务中读到的结果有可能不是最终的结果,这被称为脏读。

(3) 可重读(Repeatable Read)。在这种孤立级别下,同一事务的多个并行实例可以看到相同的数据。在这种状况下,不同的实例可能相互影响,出现“幻读”的现象。

(4) 可串行化(Serializable)。这是最高的孤立级别,此时会强制事务排序,使之不会发生相互冲突,但也会带来最低的效率,有可能出现超时现象或者共享锁竞争。

在集算器中,可以在用connect函数连接数据库时,添加选项,指定不同的事务孤立级别:@c表示Read Committed@u表示Read Uncommitted@r表示Repeatable Read@s表示Serializable

对于已经存在的数据库连接,也可以用db.isolate() 函数,获取当前事务孤立级别,并添加选项改变数据库连接的事务孤立级别。