一.数据库事务概念的引入
转账是生活中常见的操作,比如从A账户转账100元到B账号。站在用户角度而言,这是一个逻辑上的单一操作,然而在数据库系统中,至少会分成两个步骤来完成:1.将A账户的金额减少100元2.将B账户的金额增加100元。在这个过程中可能会出现以下问题:
1.转账操作的第一步执行成功,A账户上的钱减少了100元,但是第二步执行失败或者未执行便发生系统崩溃,导致B账户并没有相应增加100元。
2.转账操作刚完成就发生系统崩溃,系统重启恢复时丢失了崩溃前的转账记录。
为了便于解决这些问题,需要引入数据库事务的概念。
二、什么是数据库事务
数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
三、GBase 8a标准事务功能
转账是生活中常见的操作,比如从A账户转账100元到B账号。站在用户角度而言,这是一个逻辑上的单一操作,然而在数据库系统中,至少会分成两个步骤来完成:1.将A账户的金额减少100元2.将B账户的金额增加100元。在这个过程中可能会出现以下问题:
1.转账操作的第一步执行成功,A账户上的钱减少了100元,但是第二步执行失败或者未执行便发生系统崩溃,导致B账户并没有相应增加100元。
2.转账操作刚完成就发生系统崩溃,系统重启恢复时丢失了崩溃前的转账记录。
为了便于解决这些问题,需要引入数据库事务的概念。
二、什么是数据库事务
数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
三、GBase 8a标准事务功能
GBase 8a标准事务目前主要实现如下功能:
1. 实现统一的标准事务机制,保证事务的ACID特性;
原子性(atomicity),事务对数据的修改必须是原子的,要么全部执行,要么全部不执行。
一致性(consistency),事务在完成时,必须使所有的数据都保持一致性状态。
隔离性(isolation),由并发事务所做的修改必须与任何其他并发事务隔离。ANSI/ISOSQL92标准定义了一些数据库操作的隔离级别:未提交读(readuncommitted),提交读(readcommitted),重复读(repeatableread),序列化(serializable)。
持久性(durability),事务完成之后对数据库系统的影响是持久的,即使数据库宕机也能对数据进行恢复。
四、事务标准语法
1. 实现统一的标准事务机制,保证事务的ACID特性;
原子性(atomicity),事务对数据的修改必须是原子的,要么全部执行,要么全部不执行。
一致性(consistency),事务在完成时,必须使所有的数据都保持一致性状态。
隔离性(isolation),由并发事务所做的修改必须与任何其他并发事务隔离。ANSI/ISOSQL92标准定义了一些数据库操作的隔离级别:未提交读(readuncommitted),提交读(readcommitted),重复读(repeatableread),序列化(serializable)。
持久性(durability),事务完成之后对数据库系统的影响是持久的,即使数据库宕机也能对数据进行恢复。
四、事务标准语法
[START TRANSACTION | BEGIN] [COMMIT] [ROLLBACK] |
gbase> drop table t1;
Query OK, 0 rows affected (Elapsed: 00:00:00.09)
gbase> create table t1(a int);
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> start transaction;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> insert into t1 values(10);
Query OK, 1 row affected (Elapsed: 00:00:00.00)
gbase> commit;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> select * from t1;
+------+
| a |
+------+
| 10 |
+------+
1 row in set (Elapsed: 00:00:00.00)
gbase> begin;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> insert into t1 values(200);
Query OK, 1 row affected (Elapsed: 00:00:00.01)
gbase> rollback;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> select * from t1;
+------+
| a |
+------+
| 10 |
+------+
1 row in set (Elapsed: 00:00:00.01)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




