关键字:
事务、隔离级别、人大金仓
什么是事务
数据库中的事务是一个独立的逻辑单元,它包括了一个或多个 SQL语句。数据库工作的基本单位是事务,事务是不能被拆分的。一个事务执行的结果只可能有两个:事务内的语句都成功执行,事务执行成功,即事务提交;或事务执行失败,本事务不对数据造成任何影响,即事务回滚。
事务的ACID特性
为了保证数据库中的数据一致性,确保KingbaseES 能够在并发访问和系统发生故障时对数据进行维护,事务作为数据库工作的基本单位,具有下列四个特性,称为事务的 ACID 特性。
(1)、原子性(Atomicity)
一个事务对数据库的所有操作,是一个不可分割的工作单元。这些操作要么全部执行,要么什么也不做。
(2)、一致性(Consistency)
一个事务独立执行的结果应保持数据库的一致性,即数据不会因为事务的执行而遭受破坏。例如事务的概念里银行转账的例子,保证了数据的一致性。
(3)、隔离性(Isolation)
在多个事务并发执行时,系统应保证与这些事务先后单独执行时的结果一样,此时称事务达到了隔离性的要求,也就是在多个并发事务执行时,保证执行结果是正确的,如同单用户环境一样。隔离性是由KingbaseES 的并发控制子系统实现的。
(4)、持久性(Durability)
一个事务一旦完成全部操作后,它对数据库的所有更新应永久地反映在数据库中。即使以后系统发生故障,也应保留这个事务执行的痕迹。事务的持久性由 KingbaseES 的恢复管理子系统实现。
3、事务的管理
对于事务的管理,KingbaseES 支持事务的隐式和显式提交,即自动提交和非自动提交。
查看是否为自动提交,默认为自动提交:
test=# \echo :AUTOCOMMIT on |
(1)、自动提交事务
默认一个 SQL 语句为一个事务,当此语句执行成功后,由系统隐式提交。数据更改被数据库接受。当 SQL 执行失败,自然视做回滚,不对数据造成影响。 KingbaseES默认提交事务方式为自动提交。
(2)、非自动提交事务
事务的开始为第一个 SQL 语句。事务的结束必须用户显式的使用 COMMIT 语句提交整个事务或者使用 ROLLBACK 语句回滚整个事务。如果客户端连接断开,那么未提交的事务做回滚操作。当用户想自己控制事务的执行,可以显式的用 BEGIN 语句开始一个事务,然后在事务结束时应该使用 COMMIT 或 ROLLBACK 语句显式提交。
开启非自动提交事务的方式:
1、开启非自动提交:
test=# \SET AUTOCOMMIT OFF; |
2、使用BEGIN开启非自动提交
test=# BEGIN; |
使用\q或者是END结束事务
3、使用START TRANSACTION开启非自动提交
test=# START TRANSACTION; |
4、事务的隔离级别
在KES中,你可以指定四种标准事务隔离级别中的任意一种,但是内部只实现了三种不同的隔离级别。
(1)、读未提交隔离级别
KES未实现。
(2)、读已提交隔离级别
读已提交是KingbaseES中的默认隔离级别。当一个事务运行使用这个隔离级别时, 一个查询(没有FOR UPDATE/SHARE子句)只能看到查询开始之前已经被提交的数据,而无法看到未提交的数据或在查询执行期间其它事务提交的数据。
(3)、可重复读隔离级别
可重复读隔离级别只看到在事务开始之前被提交的数据;它从来看不到未提交的数据或者并行事务在本事务执行期间提交的修改(不过,查询能够看见在它的事务中之前执行的更新,即使它们还没有被提交)。
(4)、可序列化隔离级别
可序列化隔离级别提供了最严格的事务隔离。这个级别为所有已提交事务模拟序列事务执行;就好像事务被按照序列一个接着另一个被执行,而不是并行地被执行。
查看默认隔离级别:
test=# show default_transaction_isolation; |
修改隔离级别:
test=# alter system set default_transaction_isolation=’repeatable read’; |
5、不同隔离级别下的并发控制
隔离级别 | 脏读 | 不可重复读 | 幻读 | 序列化异常 |
读未提交 | 可能,但在KingbaseES中不可能 | 可能 | 可能 | 可能 |
读已提交 | 不可能 | 可能 | 可能 | 可能 |
可重复读 | 不可能 | 不可能 | 可能,但在KingbaseES中不可能 | 可能 |
可序列化 | 不可能 | 不可能 | 不可能 | 不可能 |
6、总结
本文主要介绍了什么是事务,事务的4大特性,事务的显示提交和隐式提交两种方式,事务的隔离级别,以及不同隔离级别下的并发控制。