java事務(wù)詳解

什么是事務(wù)?

事務(wù)(Transaction),一般是指要做的或所做的事情。在計(jì)算機(jī)術(shù)語(yǔ)中是指訪問(wèn)并可能更新數(shù)據(jù)庫(kù)中各種數(shù)據(jù)項(xiàng)的一個(gè)程序執(zhí)行單元(unit)。事務(wù)通常由高級(jí)數(shù)據(jù)庫(kù)操縱語(yǔ)言或編程語(yǔ)言(如SQL,C++或Java)書(shū)寫(xiě)的用戶程序的執(zhí)行所引起,并用形如begin transaction和end transaction語(yǔ)句(或函數(shù)調(diào)用)來(lái)界定。事務(wù)由事務(wù)開(kāi)始(begin transaction)和事務(wù)結(jié)束(end transaction)之間執(zhí)行的全體操作組成。

為什么要事務(wù)?

事務(wù)是為解決數(shù)據(jù)安全操作提出的,事務(wù)控制實(shí)際上就是控制數(shù)據(jù)的安全訪問(wèn)。

用一個(gè)簡(jiǎn)單例子說(shuō)明:銀行轉(zhuǎn)帳業(yè)務(wù),賬戶A要將自己賬戶上的1000元轉(zhuǎn)到B賬戶下面,A賬戶余額首先要減去1000元,然后B賬戶要增加1000元。假如在中間網(wǎng)絡(luò)出現(xiàn)了問(wèn)題,A賬戶減去1000元已經(jīng)結(jié)束,B因?yàn)榫W(wǎng)絡(luò)中斷而操作失敗,那么整個(gè)業(yè)務(wù)失敗,必須做出控制,要求A賬戶轉(zhuǎn)帳業(yè)務(wù)撤銷。這才能保證業(yè)務(wù)的正確性,完成這個(gè)操走就需要事務(wù),將A賬戶資金減少和B賬戶資金增加放到同一個(gè)事務(wù)里,要么全部執(zhí)行成功,要么全部撤銷,這樣就保證了數(shù)據(jù)的安全性。

事務(wù)的4個(gè)特性(ACID):

1) 原子性(atomicity):事務(wù)是數(shù)據(jù)庫(kù)的邏輯工作單位,而且是必須是原子工作單位,對(duì)于其數(shù)據(jù)修改,要么全部執(zhí)行,要么全部不執(zhí)行。

2) 一致性(consistency):事務(wù)在完成時(shí),必須是所有的數(shù)據(jù)都保持一致?tīng)顟B(tài)。在相關(guān)數(shù)據(jù)庫(kù)中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。(實(shí)例:轉(zhuǎn)賬,兩個(gè)賬戶余額相加,值不變。)

3) 隔離性(isolation):一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)所影響。

4) 持久性(durability):一個(gè)事務(wù)一旦提交,事物的操作便永久性的保存在DB中。即便是在數(shù)據(jù)庫(kù)系統(tǒng)遇到故障的情況下也不會(huì)丟失提交事務(wù)的操作。

Java有幾種類型的事務(wù)?

Java事務(wù)的類型有三0種:JDBC事務(wù)、JTA(Java Transaction API)事務(wù)、容器事務(wù)。

1.JDBC事務(wù)

在JDBC中處理事務(wù),都是通過(guò)Connection完成的。同一事務(wù)中所有的操作,都在使用同一個(gè)Connection對(duì)象。JDBC事務(wù)默認(rèn)是開(kāi)啟的,并且是默認(rèn)提交。

JDBC Connection 接口提供了兩種事務(wù)模式:自動(dòng)提交和手工提交

JDBC中的事務(wù)java.sql.Connection 的三個(gè)方法與事務(wù)有關(guān):

setAutoCommit(boolean):設(shè)置是否為自動(dòng)提交事務(wù),如果true(默認(rèn)值為true)表示自動(dòng)提交,也就是每條執(zhí)行的SQL語(yǔ)句都是一個(gè)單獨(dú)的事務(wù),如果設(shè)置為false,需要手動(dòng)提交事務(wù)。

commit():提交結(jié)束事務(wù)。

rollback():回滾結(jié)束事務(wù)。

傳統(tǒng)JDBC操作流程:

? 1).獲取JDBC連接 ??2).聲明SQL ??3).預(yù)編譯SQL ??4).執(zhí)行SQL?? 5).處理結(jié)果集 ??

??6).釋放結(jié)果集 ?7).釋放Statement ?8).提交事務(wù) ?9).處理異常并回滾事務(wù) 10).釋放JDBC連接

JDBC優(yōu)缺點(diǎn):1.冗長(zhǎng)、重復(fù) ????2.顯示事務(wù)控制 ????3.每個(gè)步驟不可獲取 ???4.顯示處理受檢查異常

JDBC為使用Java進(jìn)行數(shù)據(jù)庫(kù)的事務(wù)操作提供了最基本的支持。通過(guò)JDBC事務(wù),我們可以將多個(gè)SQL語(yǔ)句放到同一個(gè)事務(wù)中,保證其ACID特性。JDBC事務(wù)的主要優(yōu)點(diǎn)就是API比較簡(jiǎn)單,可以實(shí)現(xiàn)最基本的事務(wù)操作,性能也相對(duì)較好。但是,JDBC事務(wù)有一個(gè)局限:一個(gè) JDBC 事務(wù)不能跨越多個(gè)數(shù)據(jù)庫(kù)!所以,如果涉及到多數(shù)據(jù)庫(kù)的操作或者分布式場(chǎng)景,JDBC事務(wù)就無(wú)能為力了。

?2.JTA事務(wù)

JTA(Java Transaction API)提供了跨數(shù)據(jù)庫(kù)連接(或其他JTA資源)的事務(wù)管理能力。JTA事務(wù)管理則由JTA容器實(shí)現(xiàn),J2ee框架中事務(wù)管理器與應(yīng)用程序,資源管理器,以及應(yīng)用服務(wù)器之間的事務(wù)通訊。

1)JTA的構(gòu)成

a、高層應(yīng)用事務(wù)界定接口,供事務(wù)客戶界定事務(wù)邊界的

b、X/Open XA協(xié)議(資源之間的一種標(biāo)準(zhǔn)化的接口)的標(biāo)準(zhǔn)Java映射,它可以使事務(wù)性的資源管理器參與由外部事務(wù)管理器控制的事務(wù)中

c、高層事務(wù)管理器接口,允許應(yīng)用程序服務(wù)器為其管理的應(yīng)用程序界定事務(wù)的邊界

2)JTA的主要接口位于javax.transaction包中

a、UserTransaction接口:讓?xiě)?yīng)用程序得以控制事務(wù)的開(kāi)始、掛起、提交、回滾等。由Java客戶端程序或EJB調(diào)用。

b、TransactionManager 接口:用于應(yīng)用服務(wù)器管理事務(wù)狀態(tài)

c、Transaction接口:用于執(zhí)行相關(guān)事務(wù)操作

d、XAResource接口:用于在分布式事務(wù)環(huán)境下,協(xié)調(diào)事務(wù)管理器和資源管理器的工作

e、Xid接口:為事務(wù)標(biāo)識(shí)符的Java映射

注:前3個(gè)接口位于Java EE版的類庫(kù) javaee.jar 中,Java SE中沒(méi)有提供!UserTransaction是編程常用的接口,JTA只提供了接口,沒(méi)有具體的實(shí)現(xiàn)。

JTS(Java Transaction Service)是服務(wù)OTS的JTA的實(shí)現(xiàn)。簡(jiǎn)單的說(shuō)JTS實(shí)現(xiàn)了JTA接口,并且符合OTS的規(guī)范。

JTA的事務(wù)周期可橫跨多個(gè)JDBC Connection生命周期,對(duì)眾多Connection進(jìn)行調(diào)度,實(shí)現(xiàn)其事務(wù)性要求。

JTA可以處理任何提供符合XA接口的資源。包括:JDBC連接,數(shù)據(jù)庫(kù),JMS,商業(yè)對(duì)象等等。

3)JTA編程的基本步驟

a、首先配置JTA ,建立相應(yīng)的數(shù)據(jù)源

b、建立事務(wù):通過(guò)創(chuàng)建UserTransaction類的實(shí)例來(lái)開(kāi)始一個(gè)事務(wù)。代碼如下:

? ? Context ctx = new InitialContext(p) ;

? ? UserTransaction trans = (UserTransaction) ctx.lookup("javax. Transaction.UserTransaction")

c、開(kāi)始事務(wù):代碼為 trans.begin() ;

d、找出數(shù)據(jù)源:從Weblogic Server上找到數(shù)據(jù)源,代碼如下:

DataSource ds = (DataSource) ctx.lookup(“mysqldb") ;

e、建立數(shù)據(jù)庫(kù)連接:Connection mycon = ds.getConnection() ;

f、執(zhí)行SQL操作:stmt.executeUpdate(sqlS);

g、完成事務(wù):trans.commit(); / trans.rollback();

h、關(guān)閉連接:mycon.close() ;

JTA的優(yōu)缺點(diǎn):

JTA的優(yōu)點(diǎn)很明顯,就是提供了分布式事務(wù)的解決方案,嚴(yán)格的ACID。但是,標(biāo)準(zhǔn)的JTA方式的事務(wù)管理在日常開(kāi)發(fā)中并不常用。

JTA的缺點(diǎn)是實(shí)現(xiàn)復(fù)雜,通常情況下,JTA UserTransaction需要從JNDI獲取。這意味著,如果我們使用JTA,就需要同時(shí)使用JTA和JNDI。

JTA本身就是個(gè)笨重的API,通常JTA只能在應(yīng)用服務(wù)器環(huán)境下使用,因此使用JTA會(huì)限制代碼的復(fù)用性。

3、Spring容器事務(wù)

Spring事務(wù)管理的實(shí)現(xiàn)有許多細(xì)節(jié),如果對(duì)整個(gè)接口框架有個(gè)大體了解會(huì)非常有利于我們理解事務(wù),下面通過(guò)講解Spring的事務(wù)接口來(lái)了解Spring實(shí)現(xiàn)事務(wù)的具體策略。

Spring事務(wù)管理涉及的接口及其聯(lián)系:

Spring并不直接管理事務(wù),而是提供了多種事務(wù)管理器,他們將事務(wù)管理的職責(zé)委托給Hibernate或者JTA等持久化機(jī)制所提供的相關(guān)平臺(tái)框架的事務(wù)來(lái)實(shí)現(xiàn)。 Spring事務(wù)管理器的接口是org.springframework.transaction.PlatformTransactionManager,通過(guò)這個(gè)接口,Spring為各個(gè)平臺(tái)如JDBC、Hibernate等都提供了對(duì)應(yīng)的事務(wù)管理器,但是具體的實(shí)現(xiàn)就是各個(gè)平臺(tái)自己的事情了。

Public interface PlatformTransactionManager{ ?

? ? ? // 由TransactionDefinition得到TransactionStatus對(duì)象

? ? ? TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;

????// 提交

? ? ? Void commit(TransactionStatus status) throws TransactionException; ?

? ? ? // 回滾

? ? ? Void rollback(TransactionStatus status) throws TransactionException; ?

}

1)、Spring JDBC事務(wù)

如果應(yīng)用程序中直接使用JDBC來(lái)進(jìn)行持久化,DataSourceTransactionManager會(huì)為你處理事務(wù)邊界。為了使用? ? ?DataSourceTransactionManager,你需要使用如下的XML將其裝配到應(yīng)用程序的上下文定義中:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

? ? <property name="dataSource" ref="dataSource" />

</bean>

??實(shí)際上,DataSourceTransactionManager是通過(guò)調(diào)用java.sql.Connection來(lái)管理事務(wù)。通過(guò)調(diào)用連接的commit()方法來(lái)提交事務(wù),同樣,事務(wù)失敗則通過(guò)調(diào)用rollback()方法進(jìn)行回滾。

2)、Hibernate事務(wù)

如果應(yīng)用程序的持久化是通過(guò)Hibernate實(shí)現(xiàn)的,那么你需要使用HibernateTransactionManager。對(duì)于Hibernate3,需要在Spring上下文定義中添加如下的<bean>聲明:

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

? ? <property name="sessionFactory" ref="sessionFactory" />

</bean>

sessionFactory屬性需要裝配一個(gè)Hibernate的session工廠,HibernateTransactionManager的實(shí)現(xiàn)細(xì)節(jié)是它將事務(wù)管理的職責(zé)委托給org.hibernate.Transaction對(duì)象,而后者是從Hibernate Session中獲取到的。當(dāng)事務(wù)成功完成時(shí),HibernateTransactionManager將會(huì)調(diào)用Transaction對(duì)象的commit()方法,反之,將會(huì)調(diào)用rollback()方法。

3)、Java持久化API事務(wù)(JPA)

Hibernate多年來(lái)一直是事實(shí)上的Java持久化標(biāo)準(zhǔn),但是現(xiàn)在Java持久化API作為真正的Java持久化標(biāo)準(zhǔn)進(jìn)入大家的視野。如果你計(jì)劃使用JPA的話,那你需要使用Spring的JpaTransactionManager來(lái)處理事務(wù)。你需要在Spring中這樣配置JpaTransactionManager:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">

? ? <property name="sessionFactory" ref="sessionFactory" />

</bean>

JpaTransactionManager只需要裝配一個(gè)JPA實(shí)體管理工廠(javax.persistence.EntityManagerFactory接口的任意實(shí)現(xiàn))。JpaTransactionManager將與由工廠所產(chǎn)生的JPA EntityManager合作來(lái)構(gòu)建事務(wù)。

基本的事務(wù)屬性的定義:

事務(wù)管理器接口PlatformTransactionManager通過(guò)getTransaction(TransactionDefinition definition)方法來(lái)得到事務(wù),這個(gè)方法里面的參數(shù)是TransactionDefinition類,這個(gè)類就定義了一些基本的事務(wù)屬性。

事務(wù)屬性可以理解成事務(wù)的一些基本配置,描述了事務(wù)策略如何應(yīng)用到方法上。

事務(wù)屬性包含了5個(gè)方面:

傳播行為、隔離規(guī)則、回滾規(guī)則、事務(wù)超時(shí)、是否只讀

TransactionDefinition:

public interface TransactionDefinition {

????int getPropagationBehavior(); // 返回事務(wù)的傳播行為

????int getIsolationLevel(); // 返回事務(wù)的隔離級(jí)別,事務(wù)管理器根據(jù)它來(lái)控制另外一個(gè)事務(wù)可以看到本事務(wù)內(nèi)的哪些數(shù)據(jù)

????int getTimeout(); ?// 返回事務(wù)必須在多少秒內(nèi)完成

? ? boolean isReadOnly(); // 事務(wù)是否只讀,事務(wù)管理器能夠根據(jù)這個(gè)返回值進(jìn)行優(yōu)化,確保事務(wù)是只讀的

}

7種傳播行為:

PROPAGATION_REQUIRED:如果當(dāng)前沒(méi)有事務(wù),就新建一個(gè)事務(wù),如果已經(jīng)存在一個(gè)事務(wù)中,加入到這個(gè)事務(wù)中。這是最常見(jiàn)的選擇。

PROPAGATION_SUPPORTS:支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù),就以非事務(wù)方式執(zhí)行。

PROPAGATION_MANDATORY:支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù),就拋出異常。

PROPAGATION_REQUIRES_NEW:新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。

PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。

PROPAGATION_NEVER:以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。?

雖然有7種,但是常用的就第一種REQUIRED和第四種REQUIRES_NEW

五個(gè)隔離級(jí)別:

ISOLATION_DEFAULT:這是一個(gè)PlatfromTransactionManager默認(rèn)的隔離級(jí)別,使用數(shù)據(jù)庫(kù)默認(rèn)的事務(wù)隔離級(jí)別.

另外四個(gè)與JDBC的隔離級(jí)別相對(duì)應(yīng);

ISOLATION_READ_UNCOMMITTED:這是事務(wù)最低的隔離級(jí)別,它充許別外一個(gè)事務(wù)可以看到這個(gè)事務(wù)未提交的數(shù)據(jù)。

這種隔離級(jí)別會(huì)產(chǎn)生臟讀,不可重復(fù)讀和幻像讀。

ISOLATION_READ_COMMITTED:保證一個(gè)事務(wù)修改的數(shù)據(jù)提交后才能被另外一個(gè)事務(wù)讀取。另外一個(gè)事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)。

這種事務(wù)隔離級(jí)別可以避免臟讀出現(xiàn),但是可能會(huì)出現(xiàn)不可重復(fù)讀和幻像讀。

ISOLATION_REPEATABLE_READ:這種事務(wù)隔離級(jí)別可以防止臟讀,不可重復(fù)讀。但是可能出現(xiàn)幻像讀。

它除了保證一個(gè)事務(wù)不能讀取另一個(gè)事務(wù)未提交的數(shù)據(jù)外,還保證了避免下面的情況產(chǎn)生(不可重復(fù)讀)。

ISOLATION_SERIALIZABLE:這是花費(fèi)最高代價(jià)但是最可靠的事務(wù)隔離級(jí)別。事務(wù)被處理為順序執(zhí)行。

除了防止臟讀,不可重復(fù)讀外,還避免了幻像讀。

事務(wù)的屬性可同通過(guò)注解方式或配置文件配置:

注解方式:

@Transactional只能被應(yīng)用到public方法上,對(duì)于其它非public的方法,如果標(biāo)記了@Transactional也不會(huì)報(bào)錯(cuò),但方法沒(méi)有事務(wù)功能.

默認(rèn)情況下,一個(gè)有事務(wù)方法, 遇到RuntimeException 時(shí)會(huì)回滾 . 遇到 受檢查的異常 是不會(huì)回滾 的. 要想所有異常都回滾,要加上 @Transactional( rollbackFor={Exception.class,其它異常})?

@Transactional(

? ? readOnly = false, //讀寫(xiě)事務(wù)

? ? timeout = -1 , ????//事務(wù)的超時(shí)時(shí)間,-1為無(wú)限制

? ? noRollbackFor = ArithmeticException.class, //遇到指定的異常不回滾

? ? isolation = Isolation.DEFAULT, //事務(wù)的隔離級(jí)別,此處使用后端數(shù)據(jù)庫(kù)的默認(rèn)隔離級(jí)別

? ? propagation = Propagation.REQUIRED //事務(wù)的傳播行為

)

配置文件( aop攔截器方式):

<tx:advice id="advice" transaction-manager="txManager">

? ? ? ? ??<tx:attributes>

? ? ? ? ????<!-- tx:method的屬性:

? ? ? ? ? ? ? ? * name 是必須的,表示與事務(wù)屬性關(guān)聯(lián)的方法名(業(yè)務(wù)方法名),對(duì)切入點(diǎn)進(jìn)行細(xì)化。通配符

? ? ? ? ? ? ? ? ? ? (*)可以用來(lái)指定一批關(guān)聯(lián)到相同的事務(wù)屬性的方法。

? ? ? ? ????????? ? ? 如:'get*'、'handle*'、'on*Event'等等.

? ? ? ? ??????? * propagation:不是必須的,默認(rèn)值是REQUIRED表示事務(wù)傳播行為,

? ? ? ? ? ? ? ? ? 包括REQUIRED,SUPPORTS,MANDATORY,REQUIRES_NEW,NOT_SUPPORTED,NEVER,NESTED

? ? ? ? ??????? * isolation:不是必須的 默認(rèn)值DEFAULT ,表示事務(wù)隔離級(jí)別(數(shù)據(jù)庫(kù)的隔離級(jí)別)

? ? ? ? ??????? * timeout:不是必須的 默認(rèn)值-1(永不超時(shí)),表示事務(wù)超時(shí)的時(shí)間(以秒為單位)

? ? ? ? ? ? ? ? * read-only:不是必須的 默認(rèn)值false不是只讀的表示事務(wù)是否只讀?

? ? ? ? ??????? * rollback-for: 不是必須的表示將被觸發(fā)進(jìn)行回滾的 Exception(s);以逗號(hào)分開(kāi)。

? ? ? ? ? ? ? ? ? ?如:'com.foo.MyBusinessException,ServletException'

? ? ? ? ? ? ? ? * no-rollback-for:不是必須的表示不被觸發(fā)進(jìn)行回滾的 Exception(s),以逗號(hào)分開(kāi)。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? 如:'com.foo.MyBusinessException,ServletException' ??

? ? ? ? ? ? ? ? 任何 RuntimeException 將觸發(fā)事務(wù)回滾,但是任何 checked Exception 將不觸發(fā)事務(wù)回滾? ???????????????????

? ? ? ? ? ?-->

? ? ? ? ?????<tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>

? ? ? ? ?????<tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>

? ? ? ? ?????<tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT" read-only="false" ?rollback-for="Exception"/>

? ? ? ? ?????<!-- 其他的方法之只讀的 -->

? ? ? ? ?????<tx:method name="*" read-only="true"/>

? ? ? ? ??</tx:attributes>

</tx:advice>

---------------------

作者:share_happy_life

來(lái)源:CSDN

原文:https://blog.csdn.net/weixin_37934748/article/details/82774230

版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!

分布式事務(wù):

Tx-LCN:高性能的分布式事務(wù)框架

LCN并不產(chǎn)生事務(wù),LCN只是本地事務(wù)的協(xié)調(diào)工

兼容 dubbo,springcloud 框架,支持RPC框架拓展,支持各種ORM框架、NOSQL、負(fù)載均衡、事務(wù)補(bǔ)償。







如果使用的微服務(wù)中,服務(wù)的嵌套使用

A服務(wù)內(nèi)部使用了B服務(wù),B服務(wù)使用了C服務(wù),要保證A服務(wù)的操作一致性,這時(shí)候分布式事務(wù):Tx-LCN

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • java事務(wù)的處理 轉(zhuǎn) https://www.cnblogs.com/Bonker/p/5417967.html...
    小小的Jobs閱讀 1,620評(píng)論 0 1
  • 基本概念 事務(wù)指邏輯上的一組操作,組成這組操作的各個(gè)單元,要么全部成功,要么全部不成功。 事務(wù)類型 JDBC事務(wù) ...
    Jack4J閱讀 703評(píng)論 0 3
  • 這部分的參考文檔涉及數(shù)據(jù)訪問(wèn)和數(shù)據(jù)訪問(wèn)層和業(yè)務(wù)或服務(wù)層之間的交互。 Spring的綜合事務(wù)管理支持覆蓋很多細(xì)節(jié),然...
    竹天亮閱讀 1,094評(píng)論 0 0
  • 5.Spring的事務(wù) 通常情況下,J2EE有2種事務(wù)管理方式:全局事務(wù)和本地事務(wù),2種事務(wù)都比較明顯的缺陷。 全...
    FTOLsXD閱讀 1,577評(píng)論 0 8
  • 貓和花兒 桃花夭夭,灼灼其華 紫玉蘭 紫丁香 牡丹 錦鯉
    花落眉心閱讀 494評(píng)論 1 3

友情鏈接更多精彩內(nèi)容