添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接


Timestamp ordering(T/O)

根据事务的时间戳来决定顺序。

如果T1 的时间戳小于T2 的时间戳,那么执行的结果要等价于T1 执行早于T2 的执行。

时间戳的实现策略:
系统时钟
逻辑计数
混合方法

Basic Timestamp Ordering(T/O)Prtotocol
每一个行记录X都有两个时间戳:
W-TS(X)上一个成功写的时间戳
R-TS(X)上一个成功读的时间戳

每个操作在对X进行操作时,不能操作“来自未来的数据”。

读的情况下:
如果TS(T1)< W-TS(X) ,意思就是对X的写已经晚于T1的读取。那么X是来自未来的数据,这样就要中止T1并重新开始。
否则:
允许T1读X;
更新R-TS(X)= max(R-TS(X), TS(T1));
拷贝一个X做一个副本,确保对与T1的可重复读。

写的情况下:
如果TS(T1)< R-TS(X) or TS(T1) < W-TS(X)
中止并重新开始T1;(对于事务的写,不应该发生在未来的读和未来的写之后)
否则:
允许写,并更新W-TS(X);
拷贝一个X来作为副本,确保可重复读;

存在一个可以优化的方法

Thomas Write Rule 托马斯规则

java 并发时时间戳 时间戳并发控制_数据库


如果TS(T1)< W-TS(X)

意思就是如果未来有人写这个X,可以假设自己真的写了。忽略写并且允许继续执行。

优势:
不需要锁,没有死锁的。

但是有可能造成饥饿,当前事务比较老,需要访问的数据都已经被未来的修改过来。

造成不可恢复的事务

T1回滚了,T2已经不能恢复了。

java 并发时时间戳 时间戳并发控制_java 并发时时间戳_02


Optimistic Concurrency control (OCC)

#1 读阶段

在本地进行读写操作,并在写的操作保存在私有的本地空间。

Track the read/write sets of txns and store their writes in a private workspace.

The DBMS copies every tuple that the txn accesses from the shared database to its workspace ensure repeatable reads. #2 校验阶段

把本地写的东西和其他的事务进行比较,看是否有冲突。

Backward Validation

java 并发时时间戳 时间戳并发控制_回滚_03


Forward Validation

java 并发时时间戳 时间戳并发控制_回滚_04


第一种情况:

第一个事务完全发生,第二个才开始,这种就不需要验证。

第二种情况:

T1 在T2 进入写阶段之前,T1就完成读阶段了,并且T1 的写的和T2的读集合没有交集。

第三种情况:

T1完成读阶段在T2读阶段完成之前:并且T1并没有写任何T2读或者写的集合。

java 并发时时间戳 时间戳并发控制_回滚_05


#3 写阶段

如果校验成功,那么就将私有的改变提交给数据库。否则就中止,并重新运行。

写阶段锁全表,防止其他的事务进行同时写。

OCC适合只读的,或者没有数据交点。如果数据库非常大,并且查询是均匀的,那么冲突的概率是比较小的,所以可以使用OCC。

缺点:OCC需要本地拷贝,并且校验的时候是性能瓶颈。OCC发现出问题的时候,已经干完所有活了,所以回滚的消耗很大。


获取时间戳 java时间戳,php时间戳,mysql时间戳,js时间戳,ios时间戳,Python时间戳,PostgreSQL时间戳,Ruby时间戳,SQL Server时间戳,Unix时间戳/Li

时间戳是自1970年1月1日(O0:00:00 GMT)以来的秒数。它也被称为Unix时间戳(UnixTimestamp)。 Unix时间戳(Unix timestamp),或称Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。Unix时间戳不仅被使用在Unix系统、类Uni