What is Transaction 先摘录一段Wiki关于Transaction(事务)的释义: A transaction comprises a unit of work performed withi
What is Transaction
先摘录一段Wiki关于Transaction(事务)的释义:
A transaction comprises a unit of work performed within a database management system (or similar system) against a database, and treated in a coherent and reliable way independent of other transactions. Transactions in a database environment have two main purposes:
1. To provide reliable units of work that allow correct recovery from failures and keep a database consistent even in cases of system failure, when execution stops (completely or partially) and many operations upon a database remain uncompleted, with unclear status.
2. To provide isolation between programs accessing a database concurrently. If this isolation is not provided, the program's outcome are possibly erroneous.
A database transaction, by definition, must be atomic, consistent, isolated and durable. Database practitioners often refer to these properties of database transactions using the acronym ACID.
Transactions provide an "all-or-nothing" proposition, stating that each work-unit performed in a database must either complete in its entirety or have no effect whatsoever. Further, the system must isolate each transaction from other transactions, results must conform to existing constraints in the database, and transactions that complete successfully must get written to durable storage.
其中,all-or-nothing很明确的表达了事务的本质:“要么全成功,要么什么都没发生过”。可以把它看作一个原子操作。
HBase Transaction
(注:这里经过补充与修改,第一天就被转载本博文这里的描述不够准确)
HBase的支持的事务很有限,0.94版本的新特性中有两条:
[HBASE-3584] - Allow atomic put/delete in one call.
[HBASE-5229] - Provide basic building blocks for "multi-row" local transactions.
第一条,我引用NoSQLFan的解读:
“0.94版本具备更完整的事务支持: 之前Hbase提供行级的事务,不过每次事务只能执行一个写操作,比如连续地执行一系列Put,Delete操作,那么这些操作是单独一个个的事务,其整体并不是原子性执行的。而在0.94版本中,可以实现Put、Delete在同一个事务中一起原子性执行。”
具体怎么用呢?有下面这一段Sample:
//Add API for atomic row mutations to HBase (currently Put and Delete).
Client API would look like this:
Delete d = new Delete(ROW);
Put p = new Put(ROW);
//...
AtomicRowMutation arm = new AtomicRowMutation(ROW);
arm.add(p);
arm.add(d);
myHtable.atomicMutation(arm);
可以看到,这里的事务仅仅是针对某一行的一系列Put/Delete操作。不同行、不同表间一系列操作是无法放在一个事务中的。
第二条,,我的个人理解,这次是多行一并的事务了!不过貌似是“同一Region中的多行”。因为文中一句“ Global (cross region) transactions are not discussed here.”
因此对一张多Region表来说,还是无法保证每次修改都能封装为一个事务。