3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring Transaction Management --官方

發布時間:2025/4/5 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring Transaction Management --官方 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文鏈接:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html

?

12.?Transaction Management

12.1?Introduction to Spring Framework transaction management

Comprehensive transaction support is among the most compelling reasons to use the Spring Framework. The Spring Framework provides a consistent abstraction for transaction management that delivers the following benefits:

  • Consistent programming model across different transaction APIs such as Java Transaction API (JTA), JDBC, Hibernate, Java Persistence API (JPA), and Java Data Objects (JDO).
  • Support for?declarative transaction management.
  • Simpler API for?programmatic?transaction management than complex transaction APIs such as JTA.
  • Excellent integration with Spring’s data access abstractions.

The following sections describe the Spring Framework’s transaction value-adds and technologies. (The chapter also includes discussions of best practices, application server integration, and solutions to common problems.)

  • Advantages of the Spring Framework’s transaction support model?describes?why?you would use the Spring Framework’s transaction abstraction instead of EJB Container-Managed Transactions (CMT) or choosing to drive local transactions through a proprietary API such as Hibernate.
  • Understanding the Spring Framework transaction abstraction?outlines the core classes and describes how to configure and obtain?DataSource?instances from a variety of sources.
  • Synchronizing resources with transactionsdescribes how the application code ensures that resources are created, reused, and cleaned up properly.
  • Declarative transaction management?describes support for declarative transaction management.
  • Programmatic transaction management?covers support for programmatic (that is, explicitly coded) transaction management.

12.2?Advantages of the Spring Framework’s transaction support model

Traditionally, Java EE developers have had two choices for transaction management:?global?or?local?transactions, both of which have profound limitations. Global and local transaction management is reviewed in the next two sections, followed by a discussion of how the Spring Framework’s transaction management support addresses the limitations of the global and local transaction models.

12.2.1?Global transactions

Global transactions enable you to work with multiple transactional resources, typically relational databases and message queues. The application server manages global transactions through the JTA, which is a cumbersome API to use (partly due to its exception model). Furthermore, a JTA?UserTransaction?normally needs to be sourced from JNDI, meaning that you?also?need to use JNDI in order to use JTA. Obviously the use of global transactions would limit any potential reuse of application code, as JTA is normally only available in an application server environment.

Previously, the preferred way to use global transactions was via EJB?CMT?(Container Managed Transaction): CMT is a form of?declarative transaction management?(as distinguished from?programmatic transaction management). EJB CMT removes the need for transaction-related JNDI lookups, although of course the use of EJB itself necessitates the use of JNDI. It removes most but not all of the need to write Java code to control transactions. The significant downside is that CMT is tied to JTA and an application server environment. Also, it is only available if one chooses to implement business logic in EJBs, or at least behind a transactional EJB facade. The negatives of EJB in general are so great that this is not an attractive proposition, especially in the face of compelling alternatives for declarative transaction management.

12.2.2?Local transactions

Local transactions are resource-specific, such as a transaction associated with a JDBC connection. Local transactions may be easier to use, but have significant disadvantages: they cannot work across multiple transactional resources. For example, code that manages transactions using a JDBC connection cannot run within a global JTA transaction. Because the application server is not involved in transaction management, it cannot help ensure correctness across multiple resources. (It is worth noting that most applications use a single transaction resource.) Another downside is that local transactions are invasive to the programming model.

12.2.3?Spring Framework’s consistent programming model

Spring resolves the disadvantages of global and local transactions. It enables application developers to use a?consistent?programming model?in any environment. You write your code once, and it can benefit from different transaction management strategies in different environments. The Spring Framework provides both declarative and programmatic transaction management. Most users prefer declarative transaction management, which is recommended in most cases.

With programmatic transaction management, developers work with the Spring Framework transaction abstraction, which can run over any underlying transaction infrastructure. With the preferred declarative model, developers typically write little or no code related to transaction management, and hence do not depend on the Spring Framework transaction API, or any other transaction API.

Do you need an application server for transaction management?

The Spring Framework’s transaction management support changes traditional rules as to when an enterprise Java application requires an application server.

In particular, you do not need an application server simply for declarative transactions through EJBs. In fact, even if your application server has powerful JTA capabilities, you may decide that the Spring Framework’s declarative transactions offer more power and a more productive programming model than EJB CMT.

Typically you need an application server’s JTA capability only if your application needs to handle transactions across multiple resources, which is not a requirement for many applications. Many high-end applications use a single, highly scalable database (such as Oracle RAC) instead. Standalone transaction managers such asAtomikos Transactions?and?JOTM?are other options. Of course, you may need other application server capabilities such as Java Message Service (JMS) and Java EE Connector Architecture (JCA).

The Spring Framework?gives you the choice of when to scale your application to a fully loaded application server. Gone are the days when the only alternative to using EJB CMT or JTA was to write code with local transactions such as those on JDBC connections, and face a hefty rework if you need that code to run within global, container-managed transactions. With the Spring Framework, only some of the bean definitions in your configuration file, rather than your code, need to change.

12.3?Understanding the Spring Framework transaction abstraction

The key to the Spring transaction abstraction is the notion of a?transaction strategy. A transaction strategy is defined by theorg.springframework.transaction.PlatformTransactionManager?interface:

public interface PlatformTransactionManager {TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;void commit(TransactionStatus status) throws TransactionException;void rollback(TransactionStatus status) throws TransactionException; }

This is primarily a service provider interface (SPI), although it can be used?programmatically?from your application code. Because?PlatformTransactionManager?is aninterface, it can be easily mocked or stubbed as necessary. It is not tied to a lookup strategy such as JNDI.?PlatformTransactionManager?implementations are defined like any other object (or bean) in the Spring Framework IoC container. This benefit alone makes Spring Framework transactions a worthwhile abstraction even when you work with JTA. Transactional code can be tested much more easily than if it used JTA directly.

Again in keeping with Spring’s philosophy, the?TransactionException?that can be thrown by any of the?PlatformTransactionManager?interface’s methods isunchecked?(that is, it extends the?java.lang.RuntimeException?class). Transaction infrastructure failures are almost invariably fatal. In rare cases where application code can actually recover from a transaction failure, the application developer can still choose to catch and handle?TransactionException. The salient point is that developers are not?forced?to do so.

The?getTransaction(..)?method returns a?TransactionStatus?object, depending on a?TransactionDefinition?parameter. The returned?TransactionStatusmight represent a new transaction, or can represent an existing transaction if a matching transaction exists in the current call stack. The implication in this latter case is that, as with Java EE transaction contexts, a?TransactionStatus?is associated with a?thread?of execution.

The?TransactionDefinition?interface specifies:

  • Isolation: The degree to which this transaction is isolated from the work of other transactions. For example, can this transaction see uncommitted writes from other transactions?
  • Propagation: Typically, all code executed within a transaction scope will run in that transaction. However, you have the option of specifying the behavior in the event that a transactional method is executed when a transaction context already exists. For example, code can continue running in the existing transaction (the common case); or the existing transaction can be suspended and a new transaction created.?Spring offers all of the transaction propagation options familiar from EJB CMT. To read about the semantics of transaction propagation in Spring, see?Section?12.5.7, “Transaction propagation”.
  • Timeout: How long this transaction runs before timing out and being rolled back automatically by the underlying transaction infrastructure.
  • Read-only status: A read-only transaction can be used when your code reads but does not modify data. Read-only transactions can be a useful optimization in some cases, such as when you are using Hibernate.

These settings reflect standard transactional concepts. If necessary, refer to resources that discuss transaction isolation levels and other core transaction concepts. Understanding these concepts is essential to using the Spring Framework or any transaction management solution.

The?TransactionStatus?interface provides a simple way for transactional code to control transaction execution and query transaction status. The concepts should be familiar, as they are common to all transaction APIs:

public interface TransactionStatus extends SavepointManager {boolean isNewTransaction();boolean hasSavepoint();void setRollbackOnly(); boolean isRollbackOnly(); void flush(); boolean isCompleted(); }

Regardless of whether you opt for declarative or programmatic transaction management in Spring, defining the correct?PlatformTransactionManager?implementation is absolutely essential. You typically define this implementation through dependency injection.

PlatformTransactionManager?implementations normally require knowledge of the environment in which they work: JDBC, JTA, Hibernate, and so on. The following examples show how you can define a local?PlatformTransactionManager?implementation. (This example works with plain JDBC.)

You define a JDBC?DataSource

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean>

The related?PlatformTransactionManager?bean definition will then have a reference to the?DataSource?definition. It will look like this:

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>

If you use JTA in a Java EE container then you use a container?DataSource, obtained through JNDI, in conjunction with Spring’s?JtaTransactionManager. This is what the JTA and JNDI lookup version would look like:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd"> <jee:jndi-lookup id="dataSource" jndi-name="jdbc/jpetstore"/> <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" /> <!-- other <bean/> definitions here --> </beans>

The?JtaTransactionManager?does not need to know about the?DataSource, or any other specific resources, because it uses the container’s global transaction management infrastructure.

The above definition of the?dataSource?bean uses the?<jndi-lookup/>?tag from the?jee?namespace. For more information on schema-based configuration, see?Chapter?34,?XML Schema-based configuration, and for more information on the?<jee/>?tags see the section entitled?Section?34.2.3, “the jee schema”.

You can also use Hibernate local transactions easily, as shown in the following examples. In this case, you need to define a Hibernate?LocalSessionFactoryBean, which your application code will use to obtain Hibernate?Session?instances.

The?DataSource?bean definition will be similar to the local JDBC example shown previously and thus is not shown in the following example.

If the?DataSource, used by any non-JTA transaction manager, is looked up via JNDI and managed by a Java EE container, then it should be non-transactional because the Spring Framework, rather than the Java EE container, will manage the transactions.

The?txManager?bean in this case is of the?HibernateTransactionManager?type. In the same way as the?DataSourceTransactionManager?needs a reference to theDataSource, the?HibernateTransactionManager?needs a reference to the?SessionFactory.

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mappingResources"> <list> <value>org/springframework/samples/petclinic/hibernate/petclinic.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <value> hibernate.dialect=${hibernate.dialect} </value> </property> </bean> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>

If you are using Hibernate and Java EE container-managed JTA transactions, then you should simply use the same?JtaTransactionManager?as in the previous JTA example for JDBC.

<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>

If you use JTA , then your transaction manager definition will look the same regardless of what data access technology you use, be it JDBC, Hibernate JPA or any other supported technology. This is due to the fact that JTA transactions are global transactions, which can enlist any transactional resource.

In all these cases, application code does not need to change. You can change how transactions are managed merely by changing configuration, even if that change means moving from local to global transactions or vice versa.

12.4?Synchronizing resources with transactions

It should now be clear how you create different transaction managers, and how they are linked to related resources that need to be synchronized to transactions (for exampleDataSourceTransactionManager?to a JDBC?DataSource,?HibernateTransactionManager?to a Hibernate?SessionFactory, and so forth). This section describes how the application code, directly or indirectly using a persistence API such as JDBC, Hibernate, or JDO, ensures that these resources are created, reused, and cleaned up properly. The section also discusses how transaction synchronization is triggered (optionally) through the relevant?PlatformTransactionManager.

12.4.1?High-level synchronization approach

The preferred approach is to use Spring’s highest level template based persistence integration APIs or to use native ORM APIs with transaction- aware factory beans or proxies for managing the native resource factories. These transaction-aware solutions internally handle resource creation and reuse, cleanup, optional transaction synchronization of the resources, and exception mapping. Thus user data access code does not have to address these tasks, but can be focused purely on non-boilerplate persistence logic. Generally, you use the native ORM API or take a?template?approach for JDBC access by using the?JdbcTemplate. These solutions are detailed in subsequent chapters of this reference documentation.

12.4.2?Low-level synchronization approach

Classes such as?DataSourceUtils?(for JDBC),?EntityManagerFactoryUtils?(for JPA),?SessionFactoryUtils?(for Hibernate),PersistenceManagerFactoryUtils?(for JDO), and so on exist at a lower level. When you want the application code to deal directly with the resource types of the native persistence APIs, you use these classes to ensure that proper Spring Framework-managed instances are obtained, transactions are (optionally) synchronized, and exceptions that occur in the process are properly mapped to a consistent API.

For example, in the case of JDBC, instead of the traditional JDBC approach of calling the?getConnection()?method on the?DataSource, you instead use Spring’sorg.springframework.jdbc.datasource.DataSourceUtils?class as follows:

Connection conn = DataSourceUtils.getConnection(dataSource);

If an existing transaction already has a connection synchronized (linked) to it, that instance is returned. Otherwise, the method call triggers the creation of a new connection, which is (optionally) synchronized to any existing transaction, and made available for subsequent reuse in that same transaction. As mentioned, any?SQLException?is wrapped in a Spring Framework?CannotGetJdbcConnectionException, one of the Spring Framework’s hierarchy of unchecked DataAccessExceptions. This approach gives you more information than can be obtained easily from the?SQLException, and ensures portability across databases, even across different persistence technologies.

This approach also works without Spring transaction management (transaction synchronization is optional), so you can use it whether or not you are using Spring for transaction management.

Of course, once you have used Spring’s JDBC support, JPA support or Hibernate support, you will generally prefer not to use?DataSourceUtils?or the other helper classes, because you will be much happier working through the Spring abstraction than directly with the relevant APIs. For example, if you use the Spring?JdbcTemplate?orjdbc.object?package to simplify your use of JDBC, correct connection retrieval occurs behind the scenes and you won’t need to write any special code.

12.4.3?TransactionAwareDataSourceProxy

At the very lowest level exists the?TransactionAwareDataSourceProxy?class. This is a proxy for a target?DataSource, which wraps the target?DataSource?to add awareness of Spring-managed transactions. In this respect, it is similar to a transactional JNDI?DataSource?as provided by a Java EE server.

It should almost never be necessary or desirable to use this class, except when existing code must be called and passed a standard JDBC?DataSource?interface implementation. In that case, it is possible that this code is usable, but participating in Spring managed transactions. It is preferable to write your new code by using the higher level abstractions mentioned above.

12.5?Declarative transaction management

Most Spring Framework users choose declarative transaction management. This option has the least impact on application code, and hence is most consistent with the ideals of a?non-invasive?lightweight container.

The Spring Framework’s declarative transaction management is made possible with Spring aspect-oriented programming (AOP), although, as the transactional aspects code comes with the Spring Framework distribution and may be used in a boilerplate fashion, AOP concepts do not generally have to be understood to make effective use of this code.

The Spring Framework’s declarative transaction management is similar to EJB CMT in that you can specify transaction behavior (or lack of it) down to individual method level. It is possible to make a?setRollbackOnly()?call within a transaction context if necessary. The differences between the two types of transaction management are:

  • Unlike EJB CMT, which is tied to JTA, the Spring Framework’s declarative transaction management works in any environment. It can work with JTA transactions or local transactions using JDBC, JPA, Hibernate or JDO by simply adjusting the configuration files.
  • You can apply the Spring Framework declarative transaction management to any class, not merely special classes such as EJBs.
  • The Spring Framework offers declarative?rollback rules,a feature with no EJB equivalent. Both programmatic and declarative support for rollback rules is provided.
  • The Spring Framework enables you to customize transactional behavior, by using AOP. For example, you can insert custom behavior in the case of transaction rollback. You can also add arbitrary advice, along with the transactional advice. With EJB CMT, you cannot influence the container’s transaction management except withsetRollbackOnly().
  • The Spring Framework does not support propagation of transaction contexts across remote calls, as do high-end application servers. If you need this feature, we recommend that you use EJB. However, consider carefully before using such a feature, because normally, one does not want transactions to span remote calls.

Where is TransactionProxyFactoryBean?

Declarative transaction configuration in versions of Spring 2.0 and above differs considerably from previous versions of Spring. The main difference is that there is no longer any need to configure?TransactionProxyFactoryBean?beans.

The pre-Spring 2.0 configuration style is still 100% valid configuration; think of the new?<tx:tags/>?as simply defining?TransactionProxyFactoryBean?beans on your behalf.

The concept of rollback rules is important: they enable you to specify which exceptions (and throwables) should cause automatic rollback. You specify this declaratively, in configuration, not in Java code. So, although you can still call?setRollbackOnly()?on the?TransactionStatus?object to roll back the current transaction back, most often you can specify a rule that?MyApplicationException?must always result in rollback. The significant advantage to this option is that business objects do not depend on the transaction infrastructure. For example, they typically do not need to import Spring transaction APIs or other Spring APIs.

Although EJB container default behavior automatically rolls back the transaction on a?system exception?(usually a runtime exception), EJB CMT does not roll back the transaction automatically on anapplication exception?(that is, a checked exception other than?java.rmi.RemoteException). While the Spring default behavior for declarative transaction management follows EJB convention (roll back is automatic only on unchecked exceptions), it is often useful to customize this behavior.

12.5.1?Understanding the Spring Framework’s declarative transaction implementation

It is not sufficient to tell you simply to annotate your classes with the?@Transactional?annotation, add?@EnableTransactionManagement?to your configuration, and then expect you to understand how it all works. This section explains the inner workings of the Spring Framework’s declarative transaction infrastructure in the event of transaction-related issues.

The most important concepts to grasp with regard to the Spring Framework’s declarative transaction support are that this support is enabled?via AOP proxies, and that the transactional advice is driven by?metadata?(currently XML- or annotation-based). The combination of AOP with transactional metadata yields an AOP proxy that uses aTransactionInterceptor?in conjunction with an appropriate?PlatformTransactionManager?implementation to drive transactions?around method invocations.

Spring AOP is covered in?Chapter?9,?Aspect Oriented Programming with Spring.

Conceptually, calling a method on a transactional proxy looks like this…

Figure?12.1.?

12.5.2?Example of declarative transaction implementation

Consider the following interface, and its attendant implementation. This example uses?Foo?and?Bar?classes as placeholders so that you can concentrate on the transaction usage without focusing on a particular domain model. For the purposes of this example, the fact that the?DefaultFooService?class throwsUnsupportedOperationException?instances in the body of each implemented method is good; it allows you to see transactions created and then rolled back in response to the?UnsupportedOperationException?instance.

// the service interface that we want to make transactionalpackage x.y.service;public interface FooService {Foo getFoo(String fooName);Foo getFoo(String fooName, String barName);void insertFoo(Foo foo);void updateFoo(Foo foo); } // an implementation of the above interfacepackage x.y.service;public class DefaultFooService implements FooService {public Foo getFoo(String fooName) { throw new UnsupportedOperationException(); } public Foo getFoo(String fooName, String barName) { throw new UnsupportedOperationException(); } public void insertFoo(Foo foo) { throw new UnsupportedOperationException(); } public void updateFoo(Foo foo) { throw new UnsupportedOperationException(); } }

Assume that the first two methods of the?FooService?interface,?getFoo(String)?and?getFoo(String, String), must execute in the context of a transaction with read-only semantics, and that the other methods,?insertFoo(Foo)?and?updateFoo(Foo), must execute in the context of a transaction with read-write semantics. The following configuration is explained in detail in the next few paragraphs.

<!-- from the file 'context.xml' --> <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- this is the service object that we want to make transactional --> <bean id="fooService" class="x.y.service.DefaultFooService"/> <!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean below) --> <tx:advice id="txAdvice" transaction-manager="txManager"> <!-- the transactional semantics... --> <tx:attributes> <!-- all methods starting with 'get' are read-only --> <tx:method name="get*" read-only="true"/> <!-- other methods use the default transaction settings (see below) --> <tx:method name="*"/> </tx:attributes> </tx:advice> <!-- ensure that the above transactional advice runs for any execution of an operation defined by the FooService interface --> <aop:config> <aop:pointcut id="fooServiceOperation" expression="execution(* x.y.service.FooService.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/> </aop:config> <!-- don't forget the DataSource --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@rj-t42:1521:elvis"/> <property name="username" value="scott"/> <property name="password" value="tiger"/> </bean> <!-- similarly, don't forget the PlatformTransactionManager --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- other <bean/> definitions here --> </beans>

Examine the preceding configuration. You want to make a service object, the?fooService?bean, transactional. The transaction semantics to apply are encapsulated in the<tx:advice/>?definition. The?<tx:advice/>?definition reads as "… all methods on starting with?'get'?are to execute in the context of a read-only transaction, and all other methods are to execute with the default transaction semantics". The?transaction-manager?attribute of the?<tx:advice/>?tag is set to the name of thePlatformTransactionManager?bean that is going to?drive?the transactions, in this case, the?txManager?bean.

You can omit the?transaction-manager?attribute in the transactional advice (?<tx:advice/>) if the bean name of the?PlatformTransactionManagerthat you want to wire in has the name?transactionManager. If the?PlatformTransactionManager?bean that you want to wire in has any other name, then you must use the?transaction-manager?attribute explicitly, as in the preceding example.

The?<aop:config/>?definition ensures that the transactional advice defined by the?txAdvice?bean executes at the appropriate points in the program. First you define a pointcut that matches the execution of any operation defined in the?FooService?interface (?fooServiceOperation). Then you associate the pointcut with the?txAdviceusing an advisor. The result indicates that at the execution of a?fooServiceOperation, the advice defined by?txAdvice?will be run.

The expression defined within the?<aop:pointcut/>?element is an AspectJ pointcut expression; see?Chapter?9,?Aspect Oriented Programming with Spring?for more details on pointcut expressions in Spring.

A common requirement is to make an entire service layer transactional. The best way to do this is simply to change the pointcut expression to match any operation in your service layer. For example:

<aop:config><aop:pointcut id="fooServiceMethods" expression="execution(* x.y.service.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceMethods"/> </aop:config>

In this example it is assumed that all your service interfaces are defined in the?x.y.service?package; see?Chapter?9,?Aspect Oriented Programming with Spring?for more details.

Now that we’ve analyzed the configuration, you may be asking yourself, "Okay… but what does all this configuration actually do?".

The above configuration will be used to create a transactional proxy around the object that is created from the?fooService?bean definition. The proxy will be configured with the transactional advice, so that when an appropriate method is invoked?on the proxy, a transaction is started, suspended, marked as read-only, and so on, depending on the transaction configuration associated with that method. Consider the following program that test drives the above configuration:

public final class Boot {public static void main(final String[] args) throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext("context.xml", Boot.class); FooService fooService = (FooService) ctx.getBean("fooService"); fooService.insertFoo (new Foo()); } }

The output from running the preceding program will resemble the following. (The Log4J output and the stack trace from the UnsupportedOperationException thrown by the insertFoo(..) method of the DefaultFooService class have been truncated for clarity.)

<!-- the Spring container is starting up... --> [AspectJInvocationContextExposingAdvisorAutoProxyCreator] - Creating implicit proxy for bean fooService with 0 common interceptors and 1 specific interceptors<!-- the DefaultFooService is actually proxied --> [JdkDynamicAopProxy] - Creating JDK dynamic proxy for [x.y.service.DefaultFooService]<!-- ... the insertFoo(..) method is now being invoked on the proxy --> [TransactionInterceptor] - Getting transaction for x.y.service.FooService.insertFoo<!-- the transactional advice kicks in here... --> [DataSourceTransactionManager] - Creating new transaction with name [x.y.service.FooService.insertFoo] [DataSourceTransactionManager] - Acquired Connection [org.apache.commons.dbcp.PoolableConnection@a53de4] for JDBC transaction<!-- the insertFoo(..) method from DefaultFooService throws an exception... --> [RuleBasedTransactionAttribute] - Applying rules to determine whether transaction should rollback on java.lang.UnsupportedOperationException [TransactionInterceptor] - Invoking rollback for transaction on x.y.service.FooService.insertFoo due to throwable [java.lang.UnsupportedOperationException] <!-- and the transaction is rolled back (by default, RuntimeException instances cause rollback) --> [DataSourceTransactionManager] - Rolling back JDBC transaction on Connection [org.apache.commons.dbcp.PoolableConnection@a53de4] [DataSourceTransactionManager] - Releasing JDBC Connection after transaction [DataSourceUtils] - Returning JDBC Connection to DataSource Exception in thread "main" java.lang.UnsupportedOperationException at x.y.service.DefaultFooService.insertFoo(DefaultFooService.java:14) <!-- AOP infrastructure stack trace elements removed for clarity --> at $Proxy0.insertFoo(Unknown Source) at Boot.main(Boot.java:11)

12.5.3?Rolling back a declarative transaction

The previous section outlined the basics of how to specify transactional settings for classes, typically service layer classes, declaratively in your application. This section describes how you can control the rollback of transactions in a simple declarative fashion.

The recommended way to indicate to the Spring Framework’s transaction infrastructure that a transaction’s work is to be rolled back is to throw an?Exception?from code that is currently executing in the context of a transaction. The Spring Framework’s transaction infrastructure code will catch any unhandled?Exception?as it bubbles up the call stack, and make a determination whether to mark the transaction for rollback.

In its default configuration, the Spring Framework’s transaction infrastructure code?only?marks a transaction for rollback in the case of runtime, unchecked exceptions; that is, when the thrown exception is an instance or subclass of?RuntimeException. (?Errors will also - by default - result in a rollback). Checked exceptions that are thrown from a transactional method do?not?result in rollback in the default configuration.

You can configure exactly which?Exception?types mark a transaction for rollback, including checked exceptions. The following XML snippet demonstrates how you configure rollback for a checked, application-specific?Exception?type.

<tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="get*" read-only="true" rollback-for="NoProductInStockException"/> <tx:method name="*"/> </tx:attributes> </tx:advice>

You can also specify?no rollback rules, if you do?not?want a transaction rolled back when an exception is thrown. The following example tells the Spring Framework’s transaction infrastructure to commit the attendant transaction even in the face of an unhandled?InstrumentNotFoundException.

<tx:advice id="txAdvice"><tx:attributes><tx:method name="updateStock" no-rollback-for="InstrumentNotFoundException"/> <tx:method name="*"/> </tx:attributes> </tx:advice>

When the Spring Framework’s transaction infrastructure catches an exception and is consults configured rollback rules to determine whether to mark the transaction for rollback, the?strongest?matching rule wins. So in the case of the following configuration, any exception other than an?InstrumentNotFoundException?results in a rollback of the attendant transaction.

<tx:advice id="txAdvice"><tx:attributes><tx:method name="*" rollback-for="Throwable" no-rollback-for="InstrumentNotFoundException"/> </tx:attributes> </tx:advice>

You can also indicate a required rollback?programmatically. Although very simple, this process is quite invasive, and tightly couples your code to the Spring Framework’s transaction infrastructure:

public void resolvePosition() {try {// some business logic...} catch (NoProductInStockException ex) {// trigger rollback programmatically TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } }

You are strongly encouraged to use the declarative approach to rollback if at all possible. Programmatic rollback is available should you absolutely need it, but its usage flies in the face of achieving a clean POJO-based architecture.

12.5.4?Configuring different transactional semantics for different beans

Consider the scenario where you have a number of service layer objects, and you want to apply a?totally different?transactional configuration to each of them. You do this by defining distinct?<aop:advisor/>?elements with differing?pointcut?and?advice-ref?attribute values.

As a point of comparison, first assume that all of your service layer classes are defined in a root?x.y.service?package. To make all beans that are instances of classes defined in that package (or in subpackages) and that have names ending in?Service?have the default transactional configuration, you would write the following:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:config> <aop:pointcut id="serviceOperation" expression="execution(* x.y.service..*Service.*(..))"/> <aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"/> </aop:config> <!-- these two beans will be transactional... --> <bean id="fooService" class="x.y.service.DefaultFooService"/> <bean id="barService" class="x.y.service.extras.SimpleBarService"/> <!-- ... and these two beans won't --> <bean id="anotherService" class="org.xyz.SomeService"/> <!-- (not in the right package) --> <bean id="barManager" class="x.y.service.SimpleBarManager"/> <!-- (doesn't end in 'Service') --> <tx:advice id="txAdvice"> <tx:attributes> <tx:method name="get*" read-only="true"/> <tx:method name="*"/> </tx:attributes> </tx:advice> <!-- other transaction infrastructure beans such as a PlatformTransactionManager omitted... --> </beans>

The following example shows how to configure two distinct beans with totally different transactional settings.

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:config> <aop:pointcut id="defaultServiceOperation" expression="execution(* x.y.service.*Service.*(..))"/> <aop:pointcut id="noTxServiceOperation" expression="execution(* x.y.service.ddl.DefaultDdlManager.*(..))"/> <aop:advisor pointcut-ref="defaultServiceOperation" advice-ref="defaultTxAdvice"/> <aop:advisor pointcut-ref="noTxServiceOperation" advice-ref="noTxAdvice"/> </aop:config> <!-- this bean will be transactional (see the 'defaultServiceOperation' pointcut) --> <bean id="fooService" class="x.y.service.DefaultFooService"/> <!-- this bean will also be transactional, but with totally different transactional settings --> <bean id="anotherFooService" class="x.y.service.ddl.DefaultDdlManager"/> <tx:advice id="defaultTxAdvice"> <tx:attributes> <tx:method name="get*" read-only="true"/> <tx:method name="*"/> </tx:attributes> </tx:advice> <tx:advice id="noTxAdvice"> <tx:attributes> <tx:method name="*" propagation="NEVER"/> </tx:attributes> </tx:advice> <!-- other transaction infrastructure beans such as a PlatformTransactionManager omitted... --> </beans>

12.5.5?<tx:advice/> settings

This section summarizes the various transactional settings that can be specified using the?<tx:advice/>?tag. The default?<tx:advice/>?settings are:

  • Propagation setting?is?REQUIRED.
  • Isolation level is?DEFAULT.
  • Transaction is read/write.
  • Transaction timeout defaults to the default timeout of the underlying transaction system, or none if timeouts are not supported.
  • Any?RuntimeException?triggers rollback, and any checked?Exception?does not.

You can change these default settings; the various attributes of the?<tx:method/>?tags that are nested within?<tx:advice/>?and?<tx:attributes/>?tags are summarized below:

Table?12.1.?<tx:method/> settings

AttributeRequired?DefaultDescription

name

Yes

?

Method name(s) with which the transaction attributes are to be associated. The wildcard (*) character can be used to associate the same transaction attribute settings with a number of methods; for example,?get*,handle*,?on*Event, and so forth.

propagation

No

REQUIRED

Transaction propagation behavior.

isolation

No

DEFAULT

Transaction isolation level.

timeout

No

-1

Transaction timeout value (in seconds).

read-only

No

false

Is this transaction read-only?

rollback-for

No

?

Exception(s)?that trigger rollback; comma-delimited. For example,com.foo.MyBusinessException,ServletException.

no-rollback-for

No

?

Exception(s)?that do?not?trigger rollback; comma-delimited. For example,com.foo.MyBusinessException,ServletException.

12.5.6?Using @Transactional

In addition to the XML-based declarative approach to transaction configuration, you can use an annotation-based approach. Declaring transaction semantics directly in the Java source code puts the declarations much closer to the affected code. There is not much danger of undue coupling, because code that is meant to be used transactionally is almost always deployed that way anyway.

The ease-of-use afforded by the use of the?@Transactional?annotation is best illustrated with an example, which is explained in the text that follows. Consider the following class definition:

// the service class that we want to make transactional @Transactional public class DefaultFooService implements FooService {Foo getFoo(String fooName);Foo getFoo(String fooName, String barName);void insertFoo(Foo foo); void updateFoo(Foo foo); }

When the above POJO is defined as a bean in a Spring IoC container, the bean instance can be made transactional by adding merely?one?line of XML configuration:

<!-- from the file context.xml --> <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- this is the service object that we want to make transactional --> <bean id="fooService" class="x.y.service.DefaultFooService"/> <!-- enable the configuration of transactional behavior based on annotations --> <tx:annotation-driven transaction-manager="txManager"/><!-- a PlatformTransactionManager is still required --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- (this dependency is defined somewhere else) --> <property name="dataSource" ref="dataSource"/> </bean> <!-- other <bean/> definitions here --> </beans>

You can omit the?transaction-manager?attribute in the?<tx:annotation-driven/>?tag if the bean name of the?PlatformTransactionManager?that you want to wire in has the name?transactionManager. If the?PlatformTransactionManager?bean that you want to dependency-inject has any other name, then you have to use the?transaction-manager?attribute explicitly, as in the preceding example.

The?@EnableTransactionManagement?annotation provides equivalent support if you are using Java based configuration. Simply add the annotation to a@Configuration?class. See the javadocs for full details.

Method visibility and @Transactional

When using proxies, you should apply the?@Transactional?annotation only to methods with?public?visibility. If you do annotate protected, private or package-visible methods with the?@Transactional?annotation, no error is raised, but the annotated method does not exhibit the configured transactional settings. Consider the use of AspectJ (see below) if you need to annotate non-public methods.

You can place the?@Transactional?annotation before an interface definition, a method on an interface, a class definition, or a?public?method on a class. However, the mere presence of the?@Transactional?annotation is not enough to activate the transactional behavior. The?@Transactional?annotation is simply metadata that can be consumed by some runtime infrastructure that is?@Transactional-aware and that can use the metadata to configure the appropriate beans with transactional behavior. In the preceding example, the?<tx:annotation-driven/>?element?switches on?the transactional behavior.

Spring recommends that you only annotate concrete classes (and methods of concrete classes) with the?@Transactional?annotation, as opposed to annotating interfaces. You certainly can place the?@Transactional?annotation on an interface (or an interface method), but this works only as you would expect it to if you are using interface-based proxies. The fact that Java annotations are?not inherited from interfaces?means that if you are using class-based proxies (proxy-target-class="true") or the weaving-based aspect (?mode="aspectj"), then the transaction settings are not recognized by the proxying and weaving infrastructure, and the object will not be wrapped in a transactional proxy, which would be decidedly?bad.

In proxy mode (which is the default), only external method calls coming in through the proxy are intercepted. This means that self-invocation, in effect, a method within the target object calling another method of the target object, will not lead to an actual transaction at runtime even if the invoked method is marked with@Transactional. Also, the proxy must be fully initialized to provide the expected behaviour so you should not rely on this feature in your initialization code, i.e.@PostConstruct.

Consider the use of AspectJ mode (see mode attribute in table below) if you expect self-invocations to be wrapped with transactions as well. In this case, there will not be a proxy in the first place; instead, the target class will be weaved (that is, its byte code will be modified) in order to turn?@Transactional?into runtime behavior on any kind of method.

Table?12.2.?Annotation driven transaction settings

XML AttributeAnnotation AttributeDefaultDescription

transaction-manager

N/A (SeeTransactionManagementConfigurerjavadocs)

transactionManager

Name of transaction manager to use. Only required if the name of the transaction manager is nottransactionManager, as in the example above.

mode

mode

proxy

The default mode "proxy" processes annotated beans to be proxied using Spring’s AOP framework (following proxy semantics, as discussed above, applying to method calls coming in through the proxy only). The alternative mode "aspectj" instead weaves the affected classes with Spring’s AspectJ transaction aspect, modifying the target class byte code to apply to any kind of method call. AspectJ weaving requires spring-aspects.jar in the classpath as well as load-time weaving (or compile-time weaving) enabled. (See?the section called “Spring configuration”?for details on how to set up load-time weaving.)

proxy-target-class

proxyTargetClass

false

Applies to proxy mode only. Controls what type of transactional proxies are created for classes annotated with the?@Transactional?annotation. If the?proxy-target-class?attribute is set to?true, then class-based proxies are created. Ifproxy-target-class?is?false?or if the attribute is omitted, then standard JDK interface-based proxies are created. (See?Section?9.6, “Proxying mechanisms”for a detailed examination of the different proxy types.)

order

order

Ordered.LOWEST_PRECEDENCE

Defines the order of the transaction advice that is applied to beans annotated with?@Transactional. (For more information about the rules related to ordering of AOP advice, see?the section called “Advice ordering”.) No specified ordering means that the AOP subsystem determines the order of the advice.


The?proxy-target-class?attribute controls what type of transactional proxies are created for classes annotated with the?@Transactional?annotation. Ifproxy-target-class?is set to?true, class-based proxies are created. If?proxy-target-class?is?false?or if the attribute is omitted, standard JDK interface-based proxies are created. (See?Section?9.6, “Proxying mechanisms”?for a discussion of the different proxy types.)

@EnableTransactionManagement?and?<tx:annotation-driven/>?only looks for?@Transactional?on beans in the same application context they are defined in. This means that, if you put annotation driven configuration in a?WebApplicationContext?for a?DispatcherServlet, it only checks for@Transactional?beans in your controllers, and not your services. See?Section?17.2, “The DispatcherServlet”?for more information.

The most derived location takes precedence when evaluating the transactional settings for a method. In the case of the following example, the?DefaultFooService?class is annotated at the class level with the settings for a read-only transaction, but the?@Transactional?annotation on the?updateFoo(Foo)?method in the same class takes precedence over the transactional settings defined at the class level.

@Transactional(readOnly = true) public class DefaultFooService implements FooService {public Foo getFoo(String fooName) {// do something}// these settings have precedence for this method @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) public void updateFoo(Foo foo) { // do something } }

@Transactional settings

The?@Transactional?annotation is metadata that specifies that an interface, class, or method must have transactional semantics; for example, "start a brand new read-only transaction when this method is invoked, suspending any existing transaction". The default?@Transactional?settings are as follows:

  • Propagation setting is?PROPAGATION_REQUIRED.
  • Isolation level is?ISOLATION_DEFAULT.
  • Transaction is read/write.
  • Transaction timeout defaults to the default timeout of the underlying transaction system, or to none if timeouts are not supported.
  • Any?RuntimeException?triggers rollback, and any checked?Exception?does not.

These default settings can be changed; the various properties of the?@Transactional?annotation are summarized in the following table:

Table?12.3.?@

PropertyTypeDescription

value

String

Optional qualifier specifying the transaction manager to be used.

propagation

enum:?Propagation

Optional propagation setting.

isolation

enum:?Isolation

Optional isolation level.

readOnly

boolean

Read/write vs. read-only transaction

timeout

int (in seconds granularity)

Transaction timeout.

rollbackFor

Array of?Class?objects, which must be derived fromThrowable.

Optional array of exception classes that?must?cause rollback.

rollbackForClassName

Array of class names. Classes must be derived fromThrowable.

Optional array of names of exception classes that?must?cause rollback.

noRollbackFor

Array of?Class?objects, which must be derived fromThrowable.

Optional array of exception classes that?must not?cause rollback.

noRollbackForClassName

Array of?String?class names, which must be derived fromThrowable.

Optional array of names of exception classes that?must not?cause rollback.


Currently you cannot have explicit control over the name of a transaction, where?name?means the transaction name that will be shown in a transaction monitor, if applicable (for example, WebLogic’s transaction monitor), and in logging output. For declarative transactions, the transaction name is always the fully-qualified class name + "." + method name of the transactionally-advised class. For example, if the?handlePayment(..)?method of the?BusinessService?class started a transaction, the name of the transaction would be:?com.foo.BusinessService.handlePayment.

Multiple Transaction Managers with @Transactional

Most Spring applications only need a single transaction manager, but there may be situations where you want multiple independent transaction managers in a single application. The value attribute of the?@Transactional?annotation can be used to optionally specify the identity of the?PlatformTransactionManager?to be used. This can either be the bean name or the qualifier value of the transaction manager bean. For example, using the qualifier notation, the following Java code

public class TransactionalService {@Transactional("order")public void setSomething(String name) { ... }@Transactional("account")public void doSomething() { ... } }

could be combined with the following transaction manager bean declarations in the application context.

<tx:annotation-driven/><bean id="transactionManager1" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> ... <qualifier value="order"/> </bean> <bean id="transactionManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> ... <qualifier value="account"/> </bean>

In this case, the two methods on?TransactionalService?will run under separate transaction managers, differentiated by the "order" and "account" qualifiers. The default<tx:annotation-driven>?target bean name?transactionManager?will still be used if no specifically qualified PlatformTransactionManager bean is found.

Custom shortcut annotations

If you find you are repeatedly using the same attributes with?@Transactional?on many different methods, then?Spring’s meta-annotation support?allows you to define custom shortcut annotations for your specific use cases. For example, defining the following annotations

@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Transactional("order") public @interface OrderTx { }@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Transactional("account") public @interface AccountTx { }

allows us to write the example from the previous section as

public class TransactionalService {@OrderTxpublic void setSomething(String name) { ... }@AccountTxpublic void doSomething() { ... } }

Here we have used the syntax to define the transaction manager qualifier, but could also have included propagation behavior, rollback rules, timeouts etc.

12.5.7?Transaction propagation

This section describes some semantics of transaction propagation in Spring. Please note that this section is not an introduction to transaction propagation proper; rather it details some of the semantics regarding transaction propagation in Spring.

In Spring-managed transactions, be aware of the difference between?physical?and?logical?transactions, and how the propagation setting applies to this difference.

Required

Figure?12.2.?


PROPAGATION_REQUIRED

When the propagation setting is?PROPAGATION_REQUIRED, a?logical?transaction scope is created for each method upon which the setting is applied. Each such logical transaction scope can determine rollback-only status individually, with an outer transaction scope being logically independent from the inner transaction scope. Of course, in case of standard?PROPAGATION_REQUIRED?behavior, all these scopes will be mapped to the same physical transaction. So a rollback-only marker set in the inner transaction scope does affect the outer transaction’s chance to actually commit (as you would expect it to).

However, in the case where an inner transaction scope sets the rollback-only marker, the outer transaction has not decided on the rollback itself, and so the rollback (silently triggered by the inner transaction scope) is unexpected. A corresponding?UnexpectedRollbackException?is thrown at that point. This is?expected behavior?so that the caller of a transaction can never be misled to assume that a commit was performed when it really was not. So if an inner transaction (of which the outer caller is not aware) silently marks a transaction as rollback-only, the outer caller still calls commit. The outer caller needs to receive an?UnexpectedRollbackException?to indicate clearly that a rollback was performed instead.

RequiresNew

Figure?12.3.?


PROPAGATION_REQUIRES_NEW

PROPAGATION_REQUIRES_NEW, in contrast to?PROPAGATION_REQUIRED, uses a?completely?independent transaction for each affected transaction scope. In that case, the underlying physical transactions are different and hence can commit or roll back independently, with an outer transaction not affected by an inner transaction’s rollback status.

Nested

PROPAGATION_NESTED?uses a?single?physical transaction with multiple savepoints that it can roll back to. Such partial rollbacks allow an inner transaction scope to trigger a rollback?for its scope, with the outer transaction being able to continue the physical transaction despite some operations having been rolled back. This setting is typically mapped onto JDBC savepoints, so will only work with JDBC resource transactions. See Spring’s?DataSourceTransactionManager.

12.5.8?Advising transactional operations

Suppose you want to execute?both?transactional?and?some basic profiling advice. How do you effect this in the context of?<tx:annotation-driven/>?

When you invoke the?updateFoo(Foo)?method, you want to see the following actions:

  • Configured profiling aspect starts up.
  • Transactional advice executes.
  • Method on the advised object executes.
  • Transaction commits.
  • Profiling aspect reports exact duration of the whole transactional method invocation.

This chapter is not concerned with explaining AOP in any great detail (except as it applies to transactions). See?Chapter?9,?Aspect Oriented Programming with Spring?for detailed coverage of the following AOP configuration and AOP in general.

Here is the code for a simple profiling aspect discussed above. The ordering of advice is controlled through the?Ordered?interface. For full details on advice ordering, see?the section called “Advice ordering”. .

package x.y;import org.aspectj.lang.ProceedingJoinPoint; import org.springframework.util.StopWatch; import org.springframework.core.Ordered;public class SimpleProfiler implements Ordered { private int order; // allows us to control the ordering of advice public int getOrder() { return this.order; } public void setOrder(int order) { this.order = order; } // this method is the around advice public Object profile(ProceedingJoinPoint call) throws Throwable { Object returnValue; StopWatch clock = new StopWatch(getClass().getName()); try { clock.start(call.toShortString()); returnValue = call.proceed(); } finally { clock.stop(); System.out.println(clock.prettyPrint()); } return returnValue; } } <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="fooService" class="x.y.service.DefaultFooService"/> <!-- this is the aspect --> <bean id="profiler" class="x.y.SimpleProfiler"> <!-- execute before the transactional advice (hence the lower order number) --> <property name="order" __value="1"__/> </bean> <tx:annotation-driven transaction-manager="txManager" __order="200"__/> <aop:config> <!-- this advice will execute around the transactional advice --> <aop:aspect id="profilingAspect" ref="profiler"> <aop:pointcut id="serviceMethodWithReturnValue" expression="execution(!void x.y..*Service.*(..))"/> <aop:around method="profile" pointcut-ref="serviceMethodWithReturnValue"/> </aop:aspect> </aop:config> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@rj-t42:1521:elvis"/> <property name="username" value="scott"/> <property name="password" value="tiger"/> </bean> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> </beans>

The result of the above configuration is a?fooService?bean that has profiling and transactional aspects applied to it?in the desired order. You configure any number of additional aspects in similar fashion.

The following example effects the same setup as above, but uses the purely XML declarative approach.

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="fooService" class="x.y.service.DefaultFooService"/> <!-- the profiling advice --> <bean id="profiler" class="x.y.SimpleProfiler"> <!-- execute before the transactional advice (hence the lower order number) --> __<property name="order" value="1__"/> </bean> <aop:config> <aop:pointcut id="entryPointMethod" expression="execution(* x.y..*Service.*(..))"/> <!-- will execute after the profiling advice (c.f. the order attribute) --> <aop:advisor advice-ref="txAdvice" pointcut-ref="entryPointMethod" __order="2__"/> <!-- order value is higher than the profiling aspect --> <aop:aspect id="profilingAspect" ref="profiler"> <aop:pointcut id="serviceMethodWithReturnValue" expression="execution(!void x.y..*Service.*(..))"/> <aop:around method="profile" pointcut-ref="serviceMethodWithReturnValue"/> </aop:aspect> </aop:config> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="get*" read-only="true"/> <tx:method name="*"/> </tx:attributes> </tx:advice> <!-- other <bean/> definitions such as a DataSource and a PlatformTransactionManager here --> </beans>

The result of the above configuration will be a?fooService?bean that has profiling and transactional aspects applied to it?in that order. If you want the profiling advice to execute?after?the transactional advice on the way in, and?before?the transactional advice on the way out, then you simply swap the value of the profiling aspect bean’s?orderproperty so that it is higher than the transactional advice’s order value.

You configure additional aspects in similar fashion.

12.5.9?Using @Transactional with AspectJ

It is also possible to use the Spring Framework’s?@Transactional?support outside of a Spring container by means of an AspectJ aspect. To do so, you first annotate your classes (and optionally your classes' methods) with the?@Transactional?annotation, and then you link (weave) your application with theorg.springframework.transaction.aspectj.AnnotationTransactionAspect?defined in the?spring-aspects.jar?file. The aspect must also be configured with a transaction manager. You can of course use the Spring Framework’s IoC container to take care of dependency-injecting the aspect. The simplest way to configure the transaction management aspect is to use the?<tx:annotation-driven/>?element and specify the?mode?attribute to?aspectj?as described in?Section?12.5.6, “Using @Transactional”. Because we’re focusing here on applications running outside of a Spring container, we’ll show you how to do it programmatically.

Prior to continuing, you may want to read?Section?12.5.6, “Using @Transactional”?and?Chapter?9,?Aspect Oriented Programming with Spring?respectively.

// construct an appropriate transaction manager DataSourceTransactionManager txManager = new DataSourceTransactionManager(getDataSource());// configure the AnnotationTransactionAspect to use it; this must be done before executing any transactional methods AnnotationTransactionAspect.aspectOf().setTransactionManager(txManager);

When using this aspect, you must annotate the?implementation?class (and/or methods within that class),?not?the interface (if any) that the class implements. AspectJ follows Java’s rule that annotations on interfaces are?not inherited.

The?@Transactional?annotation on a class specifies the default transaction semantics for the execution of any method in the class.

The?@Transactional?annotation on a method within the class overrides the default transaction semantics given by the class annotation (if present). Any method may be annotated, regardless of visibility.

To weave your applications with the?AnnotationTransactionAspect?you must either build your application with AspectJ (see the?AspectJ Development Guide) or use load-time weaving. See?Section?9.8.4, “Load-time weaving with AspectJ in the Spring Framework”?for a discussion of load-time weaving with AspectJ.

12.6?Programmatic transaction management

The Spring Framework provides two means of programmatic transaction management:

  • Using the?TransactionTemplate.
  • Using a?PlatformTransactionManager?implementation directly.

The Spring team generally recommends the?TransactionTemplate?for programmatic transaction management. The second approach is similar to using the JTAUserTransaction?API, although exception handling is less cumbersome.

12.6.1?Using the TransactionTemplate

The?TransactionTemplate?adopts the same approach as other Spring?templates?such as the?JdbcTemplate. It uses a callback approach, to free application code from having to do the boilerplate acquisition and release of transactional resources, and results in code that is intention driven, in that the code that is written focuses solely on what the developer wants to do.

As you will see in the examples that follow, using the?TransactionTemplate?absolutely couples you to Spring’s transaction infrastructure and APIs. Whether or not programmatic transaction management is suitable for your development needs is a decision that you will have to make yourself.

Application code that must execute in a transactional context, and that will use the?TransactionTemplate?explicitly, looks like the following. You, as an application developer, write a?TransactionCallback?implementation (typically expressed as an anonymous inner class) that contains the code that you need to execute in the context of a transaction. You then pass an instance of your custom?TransactionCallback?to the?execute(..)?method exposed on the?TransactionTemplate.

public class SimpleService implements Service {// single TransactionTemplate shared amongst all methods in this instanceprivate final TransactionTemplate transactionTemplate; // use constructor-injection to supply the PlatformTransactionManager public SimpleService(PlatformTransactionManager transactionManager) { Assert.notNull(transactionManager, "The 'transactionManager' argument must not be null."); this.transactionTemplate = new TransactionTemplate(transactionManager); } public Object someServiceMethod() { return transactionTemplate.execute(new TransactionCallback() { // the code in this method executes in a transactional context public Object doInTransaction(TransactionStatus status) { updateOperation1(); return resultOfUpdateOperation2(); } }); } }

If there is no return value, use the convenient?TransactionCallbackWithoutResult?class with an anonymous class as follows:

transactionTemplate.execute(new TransactionCallbackWithoutResult() {protected void doInTransactionWithoutResult(TransactionStatus status) {updateOperation1();updateOperation2();} });

Code within the callback can roll the transaction back by calling the?setRollbackOnly()?method on the supplied?TransactionStatus?object:

transactionTemplate.execute(new TransactionCallbackWithoutResult() {protected void doInTransactionWithoutResult(TransactionStatus status) {try {updateOperation1();updateOperation2();} catch (SomeBusinessExeption ex) {status.setRollbackOnly(); } } });

Specifying transaction settings

You can specify transaction settings such as the propagation mode, the isolation level, the timeout, and so forth on the?TransactionTemplate?either programmatically or in configuration.?TransactionTemplate?instances by default have the?default transactional settings. The following example shows the programmatic customization of the transactional settings for a specific?TransactionTemplate:

public class SimpleService implements Service {private final TransactionTemplate transactionTemplate;public SimpleService(PlatformTransactionManager transactionManager) { Assert.notNull(transactionManager, "The 'transactionManager' argument must not be null."); this.transactionTemplate = new TransactionTemplate(transactionManager); // the transaction settings can be set here explicitly if so desired this.transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED); this.transactionTemplate.setTimeout(30); // 30 seconds // and so forth... } }

The following example defines a?TransactionTemplate?with some custom transactional settings, using Spring XML configuration. The?sharedTransactionTemplatecan then be injected into as many services as are required.

<bean id="sharedTransactionTemplate"class="org.springframework.transaction.support.TransactionTemplate"> <property name="isolationLevelName" value="ISOLATION_READ_UNCOMMITTED"/> <property name="timeout" value="30"/> </bean>"

Finally, instances of the?TransactionTemplate?class are threadsafe, in that instances do not maintain any conversational state.?TransactionTemplate?instances?dohowever maintain configuration state, so while a number of classes may share a single instance of a?TransactionTemplate, if a class needs to use aTransactionTemplate?with different settings (for example, a different isolation level), then you need to create two distinct?TransactionTemplate?instances.

12.6.2?Using the PlatformTransactionManager

You can also use the?org.springframework.transaction.PlatformTransactionManager?directly to manage your transaction. Simply pass the implementation of thePlatformTransactionManager?you are using to your bean through a bean reference. Then, using the?TransactionDefinition?and?TransactionStatus?objects you can initiate transactions, roll back, and commit.

DefaultTransactionDefinition def = new DefaultTransactionDefinition(); // explicitly setting the transaction name is something that can only be done programmatically def.setName("SomeTxName"); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);TransactionStatus status = txManager.getTransaction(def); try {// execute your business logic here } catch (MyException ex) { txManager.rollback(status); throw ex; } txManager.commit(status);

12.7?Choosing between programmatic and declarative transaction management

Programmatic transaction management is usually a good idea only if you have a small number of transactional operations. For example, if you have a web application that require transactions only for certain update operations, you may not want to set up transactional proxies using Spring or any other technology. In this case, using theTransactionTemplate?may?be a good approach. Being able to set the transaction name explicitly is also something that can only be done using the programmatic approach to transaction management.

On the other hand, if your application has numerous transactional operations, declarative transaction management is usually worthwhile. It keeps transaction management out of business logic, and is not difficult to configure. When using the Spring Framework, rather than EJB CMT, the configuration cost of declarative transaction management is greatly reduced.

12.8?Application server-specific integration

Spring’s transaction abstraction generally is application server agnostic. Additionally, Spring’s?JtaTransactionManager?class, which can optionally perform a JNDI lookup for the JTA?UserTransaction?and?TransactionManager?objects, autodetects the location for the latter object, which varies by application server. Having access to the JTA?TransactionManager?allows for enhanced transaction semantics, in particular supporting transaction suspension. See the?JtaTransactionManager?javadocs for details.

Spring’s?JtaTransactionManager?is the standard choice to run on Java EE application servers, and is known to work on all common servers. Advanced functionality such as transaction suspension works on many servers as well?—?including GlassFish, JBoss and Geronimo?—?without any special configuration required. However, for fully supported transaction suspension and further advanced integration, Spring ships special adapters for WebLogic Server and WebSphere. These adapters are discussed in the following sections.

For standard scenarios, including WebLogic Server and WebSphere, consider using the convenient?<tx:jta-transaction-manager/>?configuration element.?When configured, this element automatically detects the underlying server and chooses the best transaction manager available for the platform. This means that you won’t have to configure server-specific adapter classes (as discussed in the following sections) explicitly; rather, they are chosen automatically, with the standardJtaTransactionManager?as default fallback.

12.8.1?IBM WebSphere

On WebSphere 6.1.0.9 and above, the recommended Spring JTA transaction manager to use is?WebSphereUowTransactionManager. This special adapter leverages IBM’s?UOWManager?API, which is available in WebSphere Application Server 6.0.2.19 and later and 6.1.0.9 and later. With this adapter, Spring-driven transaction suspension (suspend/resume as initiated by?PROPAGATION_REQUIRES_NEW) is officially supported by IBM!

12.8.2?Oracle WebLogic Server

On WebLogic Server 9.0 or above, you typically would use the?WebLogicJtaTransactionManager?instead of the stock?JtaTransactionManager?class. This special WebLogic-specific subclass of the normal?JtaTransactionManager?supports the full power of Spring’s transaction definitions in a WebLogic-managed transaction environment, beyond standard JTA semantics: Features include transaction names, per-transaction isolation levels, and proper resuming of transactions in all cases.

12.9?Solutions to common problems

12.9.1?Use of the wrong transaction manager for a specific DataSource

Use the?correct?PlatformTransactionManager?implementation based on your choice of transactional technologies and requirements. Used properly, the Spring Framework merely provides a straightforward and portable abstraction. If you are using global transactions, you?must?use theorg.springframework.transaction.jta.JtaTransactionManager?class (or an?application server-specific subclass?of it) for all your transactional operations. Otherwise the transaction infrastructure attempts to perform local transactions on resources such as container?DataSource?instances. Such local transactions do not make sense, and a good application server treats them as errors.

12.10?Further Resources

For more information about the Spring Framework’s transaction support:

  • Distributed transactions in Spring, with and without XA?is a JavaWorld presentation in which Spring’s David Syer guides you through seven patterns for distributed transactions in Spring applications, three of them with XA and four without.
  • Java Transaction Design Strategies?is a book available from?InfoQ?that provides a well-paced introduction to transactions in Java. It also includes side-by-side examples of how to configure and use transactions with both the Spring Framework and EJB3.

?

轉載于:https://www.cnblogs.com/davidwang456/p/4306557.html

總結

以上是生活随笔為你收集整理的spring Transaction Management --官方的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久综合香蕉国产蜜臀av | 在线天堂新版最新版在线8 | 午夜时刻免费入口 | 无码吃奶揉捏奶头高潮视频 | 少妇人妻av毛片在线看 | 成年美女黄网站色大免费全看 | 国产亚洲人成a在线v网站 | 亚洲精品无码人妻无码 | 丰满少妇高潮惨叫视频 | 熟妇激情内射com | 亚洲熟熟妇xxxx | 男女性色大片免费网站 | 999久久久国产精品消防器材 | 人人澡人人妻人人爽人人蜜桃 | 国产手机在线αⅴ片无码观看 | av在线亚洲欧洲日产一区二区 | 超碰97人人做人人爱少妇 | 又湿又紧又大又爽a视频国产 | 亚洲成色www久久网站 | 久久久精品456亚洲影院 | 六月丁香婷婷色狠狠久久 | 精品人妻中文字幕有码在线 | 67194成是人免费无码 | 麻豆人妻少妇精品无码专区 | 成人女人看片免费视频放人 | 久久国产自偷自偷免费一区调 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产亲子乱弄免费视频 | 人人妻人人藻人人爽欧美一区 | 亚洲精品一区二区三区大桥未久 | 国产免费久久久久久无码 | 亚洲国产av精品一区二区蜜芽 | 久久精品国产一区二区三区 | 国产偷抇久久精品a片69 | 丰满人妻精品国产99aⅴ | 亚欧洲精品在线视频免费观看 | 4hu四虎永久在线观看 | 人妻插b视频一区二区三区 | 国产精品久久久午夜夜伦鲁鲁 | 极品尤物被啪到呻吟喷水 | 亚洲国产精品毛片av不卡在线 | 强伦人妻一区二区三区视频18 | 亚洲自偷精品视频自拍 | 欧洲熟妇色 欧美 | 亚洲欧美精品aaaaaa片 | 人妻天天爽夜夜爽一区二区 | 亚洲区小说区激情区图片区 | 女人被爽到呻吟gif动态图视看 | 国产精品成人av在线观看 | 国产一区二区不卡老阿姨 | 三级4级全黄60分钟 | 亚洲毛片av日韩av无码 | 久久亚洲中文字幕无码 | 国内精品一区二区三区不卡 | 黑人玩弄人妻中文在线 | 国产熟妇另类久久久久 | 日本一区二区三区免费高清 | 人妻尝试又大又粗久久 | 波多野结衣av一区二区全免费观看 | 美女极度色诱视频国产 | 大屁股大乳丰满人妻 | 久久久国产精品无码免费专区 | 成人av无码一区二区三区 | 国产av剧情md精品麻豆 | 爱做久久久久久 | 黄网在线观看免费网站 | 久久99精品国产麻豆蜜芽 | 成人一区二区免费视频 | 波多野结衣高清一区二区三区 | 人人妻人人澡人人爽人人精品 | 亚洲精品久久久久avwww潮水 | 骚片av蜜桃精品一区 | 欧美熟妇另类久久久久久多毛 | 免费播放一区二区三区 | 国产亚洲精品久久久ai换 | 久久 国产 尿 小便 嘘嘘 | 国产熟女一区二区三区四区五区 | 天堂久久天堂av色综合 | 又湿又紧又大又爽a视频国产 | 波多野结衣av在线观看 | 国产熟女一区二区三区四区五区 | 日日夜夜撸啊撸 | 久久精品女人天堂av免费观看 | 精品日本一区二区三区在线观看 | 人妻少妇被猛烈进入中文字幕 | 丰满人妻一区二区三区免费视频 | 国产精品人人妻人人爽 | 久久无码人妻影院 | 无码av岛国片在线播放 | 国产免费久久精品国产传媒 | 国产精品人人妻人人爽 | 亚洲精品久久久久久久久久久 | 在线观看国产午夜福利片 | 国产无遮挡又黄又爽免费视频 | 亚洲精品国产a久久久久久 | 成熟女人特级毛片www免费 | 夜夜夜高潮夜夜爽夜夜爰爰 | 中文字幕人妻无码一夲道 | 国产亚洲tv在线观看 | 国产欧美精品一区二区三区 | 亚洲中文字幕无码一久久区 | 午夜精品一区二区三区的区别 | 荫蒂添的好舒服视频囗交 | 99精品无人区乱码1区2区3区 | 欧美成人午夜精品久久久 | 亚洲日本va中文字幕 | 国产欧美熟妇另类久久久 | 中文字幕乱码人妻二区三区 | 狠狠色噜噜狠狠狠7777奇米 | 国产精品高潮呻吟av久久 | 日韩精品一区二区av在线 | 日本一本二本三区免费 | 中文字幕无码热在线视频 | 国产猛烈高潮尖叫视频免费 | 波多野结衣一区二区三区av免费 | 国产精品永久免费视频 | 国内老熟妇对白xxxxhd | 欧美成人午夜精品久久久 | 亚洲精品中文字幕 | 精品国产av色一区二区深夜久久 | 牲交欧美兽交欧美 | 在线观看国产午夜福利片 | 一本无码人妻在中文字幕免费 | 永久免费观看美女裸体的网站 | 无码人妻丰满熟妇区五十路百度 | 76少妇精品导航 | 中文字幕亚洲情99在线 | 色窝窝无码一区二区三区色欲 | 999久久久国产精品消防器材 | 国产在线一区二区三区四区五区 | 中文字幕无码视频专区 | 亚洲精品国偷拍自产在线麻豆 | 久久精品人人做人人综合 | 欧美性猛交内射兽交老熟妇 | 日本www一道久久久免费榴莲 | 在线亚洲高清揄拍自拍一品区 | 图片小说视频一区二区 | 色综合久久中文娱乐网 | 亚洲gv猛男gv无码男同 | 内射老妇bbwx0c0ck | 黑人巨大精品欧美黑寡妇 | 99久久精品国产一区二区蜜芽 | 中文字幕乱码人妻二区三区 | 久久综合激激的五月天 | 久久久亚洲欧洲日产国码αv | 国产明星裸体无码xxxx视频 | 国产无遮挡吃胸膜奶免费看 | 午夜熟女插插xx免费视频 | 少妇的肉体aa片免费 | 亚洲乱码国产乱码精品精 | 老司机亚洲精品影院无码 | 麻豆av传媒蜜桃天美传媒 | 亚洲の无码国产の无码步美 | 中文精品无码中文字幕无码专区 | 久在线观看福利视频 | 18禁黄网站男男禁片免费观看 | 久青草影院在线观看国产 | 最新国产麻豆aⅴ精品无码 | 99久久99久久免费精品蜜桃 | 中文字幕+乱码+中文字幕一区 | 又大又黄又粗又爽的免费视频 | 丝袜 中出 制服 人妻 美腿 | 18精品久久久无码午夜福利 | 欧美人与牲动交xxxx | 国产性生交xxxxx无码 | 亚洲gv猛男gv无码男同 | 国产成人无码a区在线观看视频app | 初尝人妻少妇中文字幕 | 无套内谢老熟女 | 少妇无码吹潮 | 日本xxxx色视频在线观看免费 | 伊人久久婷婷五月综合97色 | 中国大陆精品视频xxxx | 亚洲中文字幕va福利 | 国产免费久久精品国产传媒 | 久久精品国产大片免费观看 | 乱中年女人伦av三区 | 国产精品第一区揄拍无码 | 台湾无码一区二区 | 欧美日韩一区二区三区自拍 | 色狠狠av一区二区三区 | 人妻人人添人妻人人爱 | 亚洲va欧美va天堂v国产综合 | 亚洲自偷自拍另类第1页 | 亚洲欧美综合区丁香五月小说 | 大地资源网第二页免费观看 | 国产成人一区二区三区在线观看 | 久久久久人妻一区精品色欧美 | 双乳奶水饱满少妇呻吟 | 亚洲成av人影院在线观看 | 又黄又爽又色的视频 | 亚洲色偷偷男人的天堂 | 色欲综合久久中文字幕网 | 国产精品久久久久9999小说 | 成年女人永久免费看片 | 在线精品国产一区二区三区 | 青草视频在线播放 | 国产亚洲精品精品国产亚洲综合 | 中国大陆精品视频xxxx | 久久国语露脸国产精品电影 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲国精产品一二二线 | 国产精品人人爽人人做我的可爱 | 福利一区二区三区视频在线观看 | 狠狠cao日日穞夜夜穞av | 日本一卡2卡3卡四卡精品网站 | 欧美精品国产综合久久 | 亚洲精品久久久久avwww潮水 | 亚洲精品国产精品乱码视色 | 高中生自慰www网站 | 中文字幕乱码人妻二区三区 | 国产午夜视频在线观看 | 成年女人永久免费看片 | 水蜜桃av无码 | 大肉大捧一进一出好爽视频 | 小鲜肉自慰网站xnxx | 国产猛烈高潮尖叫视频免费 | 在线播放免费人成毛片乱码 | 日韩精品无码一区二区中文字幕 | 在线а√天堂中文官网 | а√资源新版在线天堂 | 疯狂三人交性欧美 | 国产激情精品一区二区三区 | 网友自拍区视频精品 | 中文字幕中文有码在线 | 日韩av无码中文无码电影 | 亚洲欧洲中文日韩av乱码 | 亚洲va欧美va天堂v国产综合 | 欧美丰满老熟妇xxxxx性 | 嫩b人妻精品一区二区三区 | 中文字幕+乱码+中文字幕一区 | 日本精品人妻无码77777 天堂一区人妻无码 | 青春草在线视频免费观看 | 国产精品二区一区二区aⅴ污介绍 | 特大黑人娇小亚洲女 | 久久无码中文字幕免费影院蜜桃 | 思思久久99热只有频精品66 | 久久精品人人做人人综合试看 | 亚洲小说春色综合另类 | 日日天日日夜日日摸 | 亚洲色偷偷偷综合网 | 西西人体www44rt大胆高清 | 四虎国产精品免费久久 | 伊人久久大香线蕉av一区二区 | 欧美 亚洲 国产 另类 | 久久国产劲爆∧v内射 | 免费无码一区二区三区蜜桃大 | 午夜精品久久久久久久 | 国产三级久久久精品麻豆三级 | 亚洲成a人片在线观看无码 | 欧美日韩精品 | 国产明星裸体无码xxxx视频 | 图片小说视频一区二区 | 亚洲 激情 小说 另类 欧美 | 国产区女主播在线观看 | 亚洲娇小与黑人巨大交 | 午夜福利试看120秒体验区 | 熟女少妇人妻中文字幕 | 亚洲精品www久久久 | 午夜无码区在线观看 | 国产亚洲精品久久久久久 | 成人免费无码大片a毛片 | 99精品国产综合久久久久五月天 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | av无码电影一区二区三区 | 国产精品久久久av久久久 | 天天做天天爱天天爽综合网 | 成人免费视频视频在线观看 免费 | 亚洲精品午夜国产va久久成人 | 久久视频在线观看精品 | 久久综合网欧美色妞网 | 国内少妇偷人精品视频免费 | 老司机亚洲精品影院无码 | 久久久久久av无码免费看大片 | 久久人人97超碰a片精品 | 国产无套粉嫩白浆在线 | 国产凸凹视频一区二区 | 久久人人爽人人爽人人片ⅴ | 一本久道久久综合婷婷五月 | 中文字幕乱码中文乱码51精品 | 无码av中文字幕免费放 | 亚洲成在人网站无码天堂 | 男人扒开女人内裤强吻桶进去 | 欧美35页视频在线观看 | 精品无码成人片一区二区98 | 欧美午夜特黄aaaaaa片 | 一二三四在线观看免费视频 | 国产精品高潮呻吟av久久4虎 | 国产精品久久久久久无码 | 高中生自慰www网站 | 爽爽影院免费观看 | 国产精品毛多多水多 | 午夜精品久久久久久久久 | 成人无码精品一区二区三区 | 强奷人妻日本中文字幕 | 麻豆国产丝袜白领秘书在线观看 | 久久亚洲精品中文字幕无男同 | v一区无码内射国产 | 亚洲日本一区二区三区在线 | 亚洲色欲色欲欲www在线 | 在线а√天堂中文官网 | 成人性做爰aaa片免费看不忠 | 性色av无码免费一区二区三区 | 98国产精品综合一区二区三区 | 熟妇激情内射com | 性做久久久久久久久 | 伊人久久大香线蕉av一区二区 | 国产av久久久久精东av | 日本肉体xxxx裸交 | 六月丁香婷婷色狠狠久久 | 国产人成高清在线视频99最全资源 | 伊人久久婷婷五月综合97色 | 女人被男人爽到呻吟的视频 | 亚洲の无码国产の无码步美 | 天下第一社区视频www日本 | 国内精品人妻无码久久久影院蜜桃 | 亚洲一区二区三区含羞草 | 丰满少妇弄高潮了www | 丰满人妻被黑人猛烈进入 | 性欧美牲交xxxxx视频 | 国产成人精品久久亚洲高清不卡 | 国产成人一区二区三区在线观看 | 欧美午夜特黄aaaaaa片 | 377p欧洲日本亚洲大胆 | 麻豆人妻少妇精品无码专区 | 一本色道久久综合亚洲精品不卡 | 中文字幕无码日韩欧毛 | 97久久精品无码一区二区 | 色一情一乱一伦一视频免费看 | 色妞www精品免费视频 | 亚洲熟熟妇xxxx | 97夜夜澡人人双人人人喊 | 亚洲午夜无码久久 | 欧洲精品码一区二区三区免费看 | 男人的天堂av网站 | 亚洲欧美日韩成人高清在线一区 | 无码人妻精品一区二区三区下载 | 国产欧美熟妇另类久久久 | 强辱丰满人妻hd中文字幕 | 亚洲欧洲无卡二区视頻 | 内射后入在线观看一区 | 中文无码精品a∨在线观看不卡 | 伊人久久大香线蕉av一区二区 | 亚洲精品久久久久中文第一幕 | 在线观看欧美一区二区三区 | 人妻aⅴ无码一区二区三区 | 天天拍夜夜添久久精品大 | 久久久久99精品国产片 | 国产99久久精品一区二区 | 日韩精品成人一区二区三区 | 久久精品视频在线看15 | 国产成人午夜福利在线播放 | 嫩b人妻精品一区二区三区 | 国产国产精品人在线视 | 亚洲大尺度无码无码专区 | 午夜精品久久久久久久 | 精品国产一区二区三区四区 | 久久午夜无码鲁丝片 | 爆乳一区二区三区无码 | 装睡被陌生人摸出水好爽 | 噜噜噜亚洲色成人网站 | 四虎国产精品免费久久 | 无码一区二区三区在线观看 | 熟女少妇人妻中文字幕 | 精品无码国产自产拍在线观看蜜 | 精品久久久中文字幕人妻 | 国产精品美女久久久 | 香蕉久久久久久av成人 | 国产av一区二区精品久久凹凸 | 国语自产偷拍精品视频偷 | 亚洲一区二区三区播放 | 国产午夜视频在线观看 | 日本护士毛茸茸高潮 | 亚洲精品美女久久久久久久 | 无码人妻丰满熟妇区五十路百度 | 青青青手机频在线观看 | 亚洲七七久久桃花影院 | 成在人线av无码免费 | 精品少妇爆乳无码av无码专区 | 亚洲热妇无码av在线播放 | 丰满少妇熟乱xxxxx视频 | 老熟妇乱子伦牲交视频 | 97精品国产97久久久久久免费 | 国产精品亚洲lv粉色 | 国产极品视觉盛宴 | 欧美性生交xxxxx久久久 | 亚洲a无码综合a国产av中文 | 人人澡人人妻人人爽人人蜜桃 | 日韩av无码一区二区三区不卡 | 四虎影视成人永久免费观看视频 | 内射巨臀欧美在线视频 | 久久久久久亚洲精品a片成人 | 免费视频欧美无人区码 | 亚无码乱人伦一区二区 | 人妻插b视频一区二区三区 | 日本饥渴人妻欲求不满 | 日日夜夜撸啊撸 | 人妻少妇被猛烈进入中文字幕 | 噜噜噜亚洲色成人网站 | 成人欧美一区二区三区黑人 | 亚洲欧美日韩综合久久久 | 欧美日本精品一区二区三区 | a片在线免费观看 | 天天爽夜夜爽夜夜爽 | 女人和拘做爰正片视频 | 国产人妻人伦精品1国产丝袜 | 人人妻人人藻人人爽欧美一区 | 欧美精品在线观看 | 精品成人av一区二区三区 | 狠狠cao日日穞夜夜穞av | 精品乱子伦一区二区三区 | 国产莉萝无码av在线播放 | 人妻少妇精品视频专区 | 双乳奶水饱满少妇呻吟 | 午夜丰满少妇性开放视频 | 成 人 网 站国产免费观看 | 国产亚洲精品久久久久久久 | 少妇太爽了在线观看 | 天天拍夜夜添久久精品 | 日本大乳高潮视频在线观看 | 欧美人与禽猛交狂配 | 国产无套内射久久久国产 | 性生交大片免费看l | 免费观看又污又黄的网站 | 亚洲色在线无码国产精品不卡 | 黑人粗大猛烈进出高潮视频 | 亚洲の无码国产の无码影院 | 欧美成人午夜精品久久久 | 久久国产精品二国产精品 | 丰腴饱满的极品熟妇 | av无码电影一区二区三区 | 少妇性荡欲午夜性开放视频剧场 | 亚洲精品久久久久avwww潮水 | 中文亚洲成a人片在线观看 | 欧美老妇交乱视频在线观看 | 人人妻人人澡人人爽人人精品浪潮 | 人人妻人人澡人人爽精品欧美 | 人妻天天爽夜夜爽一区二区 | 久久99精品国产麻豆 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲乱码中文字幕在线 | 网友自拍区视频精品 | 日韩精品无码免费一区二区三区 | 亚洲 日韩 欧美 成人 在线观看 | 1000部啪啪未满十八勿入下载 | 亚洲午夜无码久久 | 四虎永久在线精品免费网址 | 少妇无码av无码专区在线观看 | 日本一卡二卡不卡视频查询 | 国产综合色产在线精品 | 成人影院yy111111在线观看 | 搡女人真爽免费视频大全 | 一个人看的视频www在线 | a片免费视频在线观看 | 无码国模国产在线观看 | 美女黄网站人色视频免费国产 | 欧美怡红院免费全部视频 | 亚洲の无码国产の无码影院 | 99久久人妻精品免费一区 | 熟女少妇人妻中文字幕 | 日本一卡2卡3卡四卡精品网站 | 国产人妻人伦精品1国产丝袜 | 久久久久久av无码免费看大片 | 亚洲精品国产品国语在线观看 | 波多野结衣乳巨码无在线观看 | 天天做天天爱天天爽综合网 | 久久综合给合久久狠狠狠97色 | 久久精品国产一区二区三区 | 性生交大片免费看l | 丝袜美腿亚洲一区二区 | 日韩视频 中文字幕 视频一区 | 色狠狠av一区二区三区 | 激情爆乳一区二区三区 | 亚洲乱码中文字幕在线 | 中文字幕无码免费久久99 | 人人爽人人澡人人人妻 | 精品乱子伦一区二区三区 | 少妇激情av一区二区 | 日本www一道久久久免费榴莲 | 日韩少妇白浆无码系列 | 久久熟妇人妻午夜寂寞影院 | 日本乱偷人妻中文字幕 | 国产午夜无码视频在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 日本欧美一区二区三区乱码 | 欧洲欧美人成视频在线 | 久久久中文字幕日本无吗 | 色妞www精品免费视频 | 日韩av激情在线观看 | 成人欧美一区二区三区 | 97夜夜澡人人双人人人喊 | 国产乱人伦偷精品视频 | 久久www免费人成人片 | 日韩精品一区二区av在线 | 麻豆国产人妻欲求不满谁演的 | 久久久久久av无码免费看大片 | 国产精品亚洲а∨无码播放麻豆 | 欧洲美熟女乱又伦 | 日韩视频 中文字幕 视频一区 | 亚洲色大成网站www国产 | 久久国产精品偷任你爽任你 | 无码帝国www无码专区色综合 | 国产精品亚洲а∨无码播放麻豆 | 窝窝午夜理论片影院 | 牲欲强的熟妇农村老妇女 | 国产激情无码一区二区app | 麻豆成人精品国产免费 | 夜夜躁日日躁狠狠久久av | 成熟人妻av无码专区 | 亚洲色在线无码国产精品不卡 | 亚洲午夜无码久久 | 亚洲s码欧洲m码国产av | 午夜理论片yy44880影院 | 久久久久久亚洲精品a片成人 | 内射欧美老妇wbb | 人人妻人人澡人人爽欧美精品 | 激情内射亚州一区二区三区爱妻 | 丰满人妻精品国产99aⅴ | 日韩欧美群交p片內射中文 | 国内揄拍国内精品人妻 | 国产午夜亚洲精品不卡下载 | 无码人妻黑人中文字幕 | 无码一区二区三区在线 | 玩弄中年熟妇正在播放 | 欧美午夜特黄aaaaaa片 | 欧美成人午夜精品久久久 | 久激情内射婷内射蜜桃人妖 | 成人欧美一区二区三区黑人 | 亚洲综合无码久久精品综合 | 丰满少妇高潮惨叫视频 | 精品人妻人人做人人爽夜夜爽 | 亚洲精品国偷拍自产在线麻豆 | 国产精品毛多多水多 | 亚洲の无码国产の无码影院 | 在线视频网站www色 | 国产综合色产在线精品 | 熟妇人妻无乱码中文字幕 | 久久国产精品偷任你爽任你 | 又大又硬又黄的免费视频 | 无码纯肉视频在线观看 | 少妇久久久久久人妻无码 | 国内精品久久久久久中文字幕 | 天天拍夜夜添久久精品大 | 76少妇精品导航 | 亚洲一区二区三区偷拍女厕 | 一本精品99久久精品77 | 老熟女重囗味hdxx69 | 国产亚洲日韩欧美另类第八页 | 国产高清av在线播放 | 最近免费中文字幕中文高清百度 | 国产精品无码久久av | 免费无码av一区二区 | 国产综合色产在线精品 | 亚洲精品国产精品乱码视色 | 伊人久久大香线焦av综合影院 | 欧美一区二区三区 | 99国产精品白浆在线观看免费 | 麻豆精品国产精华精华液好用吗 | 日本一区二区更新不卡 | 激情内射亚州一区二区三区爱妻 | 日本免费一区二区三区最新 | 好男人社区资源 | 偷窥日本少妇撒尿chinese | aⅴ亚洲 日韩 色 图网站 播放 | 亚洲啪av永久无码精品放毛片 | 一本色道久久综合亚洲精品不卡 | 亚洲精品欧美二区三区中文字幕 | 大地资源中文第3页 | 波多野结衣乳巨码无在线观看 | 熟女体下毛毛黑森林 | 无码人妻黑人中文字幕 | a在线观看免费网站大全 | 久久亚洲日韩精品一区二区三区 | 精品久久8x国产免费观看 | 天海翼激烈高潮到腰振不止 | 国内精品人妻无码久久久影院 | 麻豆精品国产精华精华液好用吗 | 欧美性黑人极品hd | 无套内谢老熟女 | 亚洲欧洲日本无在线码 | 国产午夜亚洲精品不卡下载 | 狠狠色丁香久久婷婷综合五月 | 国产片av国语在线观看 | 97se亚洲精品一区 | 丰满少妇人妻久久久久久 | 国产艳妇av在线观看果冻传媒 | 伊人久久大香线焦av综合影院 | 中文字幕无码乱人伦 | 女人被男人躁得好爽免费视频 | 亚洲人成影院在线无码按摩店 | 夜夜高潮次次欢爽av女 | 国产香蕉97碰碰久久人人 | 娇妻被黑人粗大高潮白浆 | 日本精品人妻无码77777 天堂一区人妻无码 | 日本乱人伦片中文三区 | 欧美激情综合亚洲一二区 | 97色伦图片97综合影院 | a在线观看免费网站大全 | 国内丰满熟女出轨videos | 无码乱肉视频免费大全合集 | 国产9 9在线 | 中文 | 欧美老人巨大xxxx做受 | 黑人巨大精品欧美一区二区 | 天天躁夜夜躁狠狠是什么心态 | 中文字幕av伊人av无码av | 久久久av男人的天堂 | 欧美精品无码一区二区三区 | 国产又爽又猛又粗的视频a片 | 亚洲国产精品无码一区二区三区 | 亚洲国产高清在线观看视频 | 国产国产精品人在线视 | 18无码粉嫩小泬无套在线观看 | 伊人色综合久久天天小片 | 性色av无码免费一区二区三区 | 蜜桃无码一区二区三区 | 国产成人综合色在线观看网站 | 欧美 丝袜 自拍 制服 另类 | 午夜嘿嘿嘿影院 | 国产成人精品三级麻豆 | 国产亚洲精品久久久久久国模美 | 大地资源中文第3页 | 精品国偷自产在线视频 | 色婷婷av一区二区三区之红樱桃 | 婷婷五月综合缴情在线视频 | 亚洲区小说区激情区图片区 | 日日躁夜夜躁狠狠躁 | 国产av人人夜夜澡人人爽麻豆 | 自拍偷自拍亚洲精品被多人伦好爽 | 亲嘴扒胸摸屁股激烈网站 | 最新国产乱人伦偷精品免费网站 | 成人无码视频免费播放 | 中文字幕av日韩精品一区二区 | 小sao货水好多真紧h无码视频 | 久久伊人色av天堂九九小黄鸭 | 久久久无码中文字幕久... | 久久国产精品偷任你爽任你 | 亚洲国产精品久久人人爱 | 少妇太爽了在线观看 | 女人被爽到呻吟gif动态图视看 | 精品国产aⅴ无码一区二区 | 两性色午夜视频免费播放 | 日韩亚洲欧美中文高清在线 | 东京无码熟妇人妻av在线网址 | 波多野结衣高清一区二区三区 | 强辱丰满人妻hd中文字幕 | 无遮无挡爽爽免费视频 | 麻豆国产人妻欲求不满 | 曰本女人与公拘交酡免费视频 | 国产人成高清在线视频99最全资源 | 青草青草久热国产精品 | 精品国偷自产在线视频 | 老太婆性杂交欧美肥老太 | 国产精品人妻一区二区三区四 | 欧美激情综合亚洲一二区 | 国产极品美女高潮无套在线观看 | 小泽玛莉亚一区二区视频在线 | 国产成人精品一区二区在线小狼 | 国产艳妇av在线观看果冻传媒 | 国产人妻久久精品二区三区老狼 | 精品欧美一区二区三区久久久 | 亚洲色大成网站www国产 | 日韩精品成人一区二区三区 | 黑人粗大猛烈进出高潮视频 | 免费无码午夜福利片69 | 黑森林福利视频导航 | 亚洲精品久久久久avwww潮水 | 亚洲精品久久久久久一区二区 | 国产熟妇另类久久久久 | 亚洲aⅴ无码成人网站国产app | 巨爆乳无码视频在线观看 | 无码精品人妻一区二区三区av | 精品人妻人人做人人爽夜夜爽 | 国产精品无码一区二区三区不卡 | 国产成人无码av片在线观看不卡 | 久久久www成人免费毛片 | 国产人妻久久精品二区三区老狼 | 国产成人精品久久亚洲高清不卡 | 久久久中文久久久无码 | 亚洲乱码国产乱码精品精 | 国产真实伦对白全集 | 成人无码精品1区2区3区免费看 | 亚洲精品一区二区三区四区五区 | 亚洲综合精品香蕉久久网 | 欧美野外疯狂做受xxxx高潮 | 男人的天堂2018无码 | 无套内谢的新婚少妇国语播放 | 国产婷婷色一区二区三区在线 | 欧美性生交xxxxx久久久 | 骚片av蜜桃精品一区 | 亚洲 欧美 激情 小说 另类 | 亚洲日本va午夜在线电影 | 亚洲成色在线综合网站 | 日日麻批免费40分钟无码 | 国产精品高潮呻吟av久久4虎 | 久久久久久国产精品无码下载 | 77777熟女视频在线观看 а天堂中文在线官网 | 亚洲国产高清在线观看视频 | 老熟女重囗味hdxx69 | 丰满人妻精品国产99aⅴ | 无码纯肉视频在线观看 | 国产欧美精品一区二区三区 | 国产精品欧美成人 | 麻豆成人精品国产免费 | 国产精品多人p群无码 | 亚洲欧美精品伊人久久 | 亚洲七七久久桃花影院 | 久久久久免费看成人影片 | 5858s亚洲色大成网站www | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 欧美野外疯狂做受xxxx高潮 | 77777熟女视频在线观看 а天堂中文在线官网 | 东京热无码av男人的天堂 | 国产精品va在线观看无码 | 久久人人爽人人爽人人片ⅴ | 欧美精品一区二区精品久久 | 亚洲日本va中文字幕 | 熟女俱乐部五十路六十路av | 成人无码精品一区二区三区 | 亚洲国产高清在线观看视频 | 国产精品视频免费播放 | 欧美自拍另类欧美综合图片区 | 四虎国产精品一区二区 | 樱花草在线播放免费中文 | av无码电影一区二区三区 | 又大又紧又粉嫩18p少妇 | 中文字幕无码热在线视频 | 人人妻人人澡人人爽人人精品浪潮 | 少妇人妻av毛片在线看 | 大肉大捧一进一出视频出来呀 | 日产国产精品亚洲系列 | 无遮挡国产高潮视频免费观看 | 久久精品人人做人人综合试看 | 国产精品鲁鲁鲁 | 麻豆蜜桃av蜜臀av色欲av | 成熟人妻av无码专区 | 国产亚洲视频中文字幕97精品 | 一区二区三区乱码在线 | 欧洲 | 亚拍精品一区二区三区探花 | 久久精品中文字幕大胸 | 狠狠亚洲超碰狼人久久 | 国产女主播喷水视频在线观看 | 中文字幕无线码 | 国产成人一区二区三区别 | 中文字幕乱码人妻二区三区 | 国产口爆吞精在线视频 | 亚洲国产精品无码久久久久高潮 | 日本成熟视频免费视频 | 久久国产精品二国产精品 | 久久久久人妻一区精品色欧美 | 初尝人妻少妇中文字幕 | 妺妺窝人体色www在线小说 | 2019午夜福利不卡片在线 | 久久久久99精品国产片 | 精品欧洲av无码一区二区三区 | 精品一区二区不卡无码av | 精品国产一区二区三区四区 | 亚洲国产一区二区三区在线观看 | 亚欧洲精品在线视频免费观看 | 乱码av麻豆丝袜熟女系列 | 国产精品第一国产精品 | 午夜精品一区二区三区的区别 | 狂野欧美性猛xxxx乱大交 | 亚洲精品午夜国产va久久成人 | 欧洲vodafone精品性 | 人妻尝试又大又粗久久 | 亚洲日韩av一区二区三区四区 | a片免费视频在线观看 | 黑人巨大精品欧美一区二区 | 人人爽人人爽人人片av亚洲 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国产极品视觉盛宴 | 国产精品人人爽人人做我的可爱 | 亚洲 欧美 激情 小说 另类 | 国产偷国产偷精品高清尤物 | a在线观看免费网站大全 | 水蜜桃av无码 | 亚洲精品一区二区三区在线观看 | 成年女人永久免费看片 | 一个人免费观看的www视频 | 亚洲中文字幕无码中字 | 久久久婷婷五月亚洲97号色 | 日本精品少妇一区二区三区 | 久久99精品国产麻豆蜜芽 | 中文字幕av日韩精品一区二区 | 久久久久亚洲精品中文字幕 | 噜噜噜亚洲色成人网站 | 亚洲一区二区观看播放 | 成人性做爰aaa片免费看 | 国产人妻大战黑人第1集 | 亚洲成a人片在线观看无码3d | 真人与拘做受免费视频 | 99久久人妻精品免费二区 | 日欧一片内射va在线影院 | 国产香蕉尹人综合在线观看 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 久久zyz资源站无码中文动漫 | 国产精品va在线播放 | 亚洲色www成人永久网址 | 青青青爽视频在线观看 | 纯爱无遮挡h肉动漫在线播放 | 人人爽人人爽人人片av亚洲 | 成在人线av无码免观看麻豆 | 中文亚洲成a人片在线观看 | 欧美日韩色另类综合 | 国产一区二区三区日韩精品 | 曰韩少妇内射免费播放 | 精品无码国产一区二区三区av | 少妇的肉体aa片免费 | 色婷婷欧美在线播放内射 | 日本丰满熟妇videos | 国产性生交xxxxx无码 | 老司机亚洲精品影院无码 | 永久黄网站色视频免费直播 | 欧美人与牲动交xxxx | 成人无码视频免费播放 | 成人无码精品一区二区三区 | 高中生自慰www网站 | 国产两女互慰高潮视频在线观看 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 性开放的女人aaa片 | 亚洲成av人在线观看网址 | 成人aaa片一区国产精品 | 岛国片人妻三上悠亚 | 国产午夜视频在线观看 | www国产亚洲精品久久网站 | 亚洲中文字幕在线观看 | 无码人妻精品一区二区三区下载 | 天天av天天av天天透 | 国产无套内射久久久国产 | 亚洲春色在线视频 | 精品国产青草久久久久福利 | 亚洲日韩av一区二区三区四区 | 久久人妻内射无码一区三区 | 波多野结衣av一区二区全免费观看 | 中文字幕日韩精品一区二区三区 | 奇米影视7777久久精品人人爽 | 午夜免费福利小电影 | 欧美野外疯狂做受xxxx高潮 | 久久精品人人做人人综合 | 国产亚洲视频中文字幕97精品 | 久久久精品成人免费观看 | 无码任你躁久久久久久久 | 国产热a欧美热a在线视频 | 色爱情人网站 | 日韩精品a片一区二区三区妖精 | 亚洲日韩一区二区三区 | 97无码免费人妻超级碰碰夜夜 | 少妇人妻偷人精品无码视频 | 久久精品国产一区二区三区 | 在线观看欧美一区二区三区 | 老司机亚洲精品影院 | 亚洲小说春色综合另类 | 妺妺窝人体色www在线小说 | 樱花草在线播放免费中文 | 强伦人妻一区二区三区视频18 | 国产精品福利视频导航 | 激情综合激情五月俺也去 | 国产熟妇高潮叫床视频播放 | 极品尤物被啪到呻吟喷水 | 中文字幕av伊人av无码av | 久9re热视频这里只有精品 | 国产高清av在线播放 | 中文字幕无码视频专区 | 俺去俺来也在线www色官网 | 久久久久久久人妻无码中文字幕爆 | 日本肉体xxxx裸交 | 免费观看激色视频网站 | 九九热爱视频精品 | 亚洲理论电影在线观看 | 国产精品久久久av久久久 | 人人妻人人澡人人爽人人精品浪潮 | 亚洲精品中文字幕乱码 | 自拍偷自拍亚洲精品10p | 国产美女精品一区二区三区 | 中国大陆精品视频xxxx | 国产人妻久久精品二区三区老狼 | 中文字幕+乱码+中文字幕一区 | 国内精品久久久久久中文字幕 | 永久免费观看美女裸体的网站 | 久久99精品久久久久婷婷 | 老头边吃奶边弄进去呻吟 | 欧美zoozzooz性欧美 | 精品日本一区二区三区在线观看 | 久久久久免费看成人影片 | 亚洲色欲久久久综合网东京热 | 99久久久无码国产精品免费 | 丰满肥臀大屁股熟妇激情视频 | 国产人成高清在线视频99最全资源 | 午夜福利一区二区三区在线观看 | 久久精品国产99久久6动漫 | 呦交小u女精品视频 | 性生交片免费无码看人 | 久久国产劲爆∧v内射 | 88国产精品欧美一区二区三区 | 男女作爱免费网站 | 久久精品成人欧美大片 | 在线观看国产午夜福利片 | 欧洲极品少妇 | 精品一区二区不卡无码av | 亚洲精品成人福利网站 | 久久国产精品偷任你爽任你 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产热a欧美热a在线视频 | 老司机亚洲精品影院无码 | 精品国偷自产在线视频 | 色婷婷久久一区二区三区麻豆 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产精品久久久久久无码 | 国产精品二区一区二区aⅴ污介绍 | 亚洲日本一区二区三区在线 | 丰满人妻一区二区三区免费视频 | 国产女主播喷水视频在线观看 | 波多野结衣一区二区三区av免费 | 亚洲日韩中文字幕在线播放 | 夜夜影院未满十八勿进 | 人人妻人人藻人人爽欧美一区 | 久久久精品人妻久久影视 | 国产人成高清在线视频99最全资源 | 又粗又大又硬又长又爽 | 久久成人a毛片免费观看网站 | 久久久久久a亚洲欧洲av冫 | 亚洲s色大片在线观看 | 永久免费观看国产裸体美女 | 特级做a爰片毛片免费69 | 性欧美牲交在线视频 | 嫩b人妻精品一区二区三区 | 日本免费一区二区三区最新 | 亚洲性无码av中文字幕 | 久久精品人人做人人综合试看 | 国产乱子伦视频在线播放 | 精品一区二区不卡无码av | 蜜桃av抽搐高潮一区二区 | 国产乱人伦av在线无码 | 天天av天天av天天透 | 精品无码国产自产拍在线观看蜜 | 免费无码av一区二区 | 国产精品成人av在线观看 | 美女毛片一区二区三区四区 | 天天躁日日躁狠狠躁免费麻豆 | 精品aⅴ一区二区三区 | 中文精品久久久久人妻不卡 | 一本久久伊人热热精品中文字幕 | 对白脏话肉麻粗话av | 在线观看免费人成视频 | 精品 日韩 国产 欧美 视频 | 一二三四社区在线中文视频 | 欧美怡红院免费全部视频 | 强奷人妻日本中文字幕 | 国产成人无码一二三区视频 | 熟女体下毛毛黑森林 | 两性色午夜视频免费播放 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 性欧美牲交在线视频 | 久久人人爽人人爽人人片ⅴ | 国产精品亚洲专区无码不卡 | 亚洲成av人综合在线观看 | 成人免费无码大片a毛片 | 午夜精品一区二区三区的区别 | 玩弄中年熟妇正在播放 | 国产 浪潮av性色四虎 | 麻豆人妻少妇精品无码专区 | 精品人妻人人做人人爽夜夜爽 | 日本熟妇乱子伦xxxx | 小sao货水好多真紧h无码视频 | 乌克兰少妇性做爰 | 国产又爽又黄又刺激的视频 | 香港三级日本三级妇三级 | 欧美 亚洲 国产 另类 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产香蕉尹人综合在线观看 | 欧美精品无码一区二区三区 | 亚洲国产精华液网站w | 呦交小u女精品视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产农村妇女高潮大叫 | 亚洲色在线无码国产精品不卡 | 久在线观看福利视频 | 激情国产av做激情国产爱 | 久久精品国产精品国产精品污 | 中文字幕无码免费久久9一区9 | 久热国产vs视频在线观看 | 高潮毛片无遮挡高清免费 | 国产亚洲精品久久久久久久 | 国产一区二区三区四区五区加勒比 | 亚洲自偷精品视频自拍 | 精品国产一区二区三区四区 | 麻豆国产人妻欲求不满谁演的 | 无码av最新清无码专区吞精 | 全黄性性激高免费视频 | 精品国产一区二区三区四区 | 丰满人妻一区二区三区免费视频 | 中文字幕人妻无码一夲道 | 国内精品人妻无码久久久影院蜜桃 | 波多野结衣av在线观看 | 夜精品a片一区二区三区无码白浆 | 国产精品久久国产精品99 | 日日噜噜噜噜夜夜爽亚洲精品 | 夜精品a片一区二区三区无码白浆 | 乌克兰少妇性做爰 | 欧美激情内射喷水高潮 | 人人妻人人澡人人爽精品欧美 | 国产两女互慰高潮视频在线观看 | 亚洲热妇无码av在线播放 | 伦伦影院午夜理论片 | 色诱久久久久综合网ywww | 俺去俺来也在线www色官网 | 欧美精品在线观看 | 国产97人人超碰caoprom | 成人无码精品1区2区3区免费看 | 丰腴饱满的极品熟妇 | 欧美刺激性大交 | 精品久久8x国产免费观看 | 亚洲国精产品一二二线 | 青青青手机频在线观看 | 天天综合网天天综合色 | 好屌草这里只有精品 | 国产麻豆精品精东影业av网站 | 麻豆md0077饥渴少妇 | 纯爱无遮挡h肉动漫在线播放 | 日日天日日夜日日摸 | 97se亚洲精品一区 | 国产真实乱对白精彩久久 | 老熟女重囗味hdxx69 | 日韩精品久久久肉伦网站 | 大色综合色综合网站 | 55夜色66夜色国产精品视频 | 乱码av麻豆丝袜熟女系列 | 日本精品人妻无码免费大全 | 亚洲日本va中文字幕 | 中文字幕av伊人av无码av | 亚洲日韩av一区二区三区中文 | 少妇被黑人到高潮喷出白浆 | 国产无遮挡又黄又爽又色 | 夜先锋av资源网站 | 青青青爽视频在线观看 | 亚洲熟妇色xxxxx欧美老妇 | 国产成人精品优优av | 无遮挡啪啪摇乳动态图 | 久久久久se色偷偷亚洲精品av | 久久综合香蕉国产蜜臀av | 在线精品国产一区二区三区 | 国精品人妻无码一区二区三区蜜柚 | 樱花草在线社区www | 俺去俺来也www色官网 | 亚洲小说图区综合在线 | 18禁黄网站男男禁片免费观看 | 国产香蕉尹人综合在线观看 | 性色av无码免费一区二区三区 | 国产黄在线观看免费观看不卡 | 蜜桃av抽搐高潮一区二区 | 奇米影视888欧美在线观看 | 日本熟妇乱子伦xxxx | 麻豆精品国产精华精华液好用吗 | 无码人妻黑人中文字幕 | 特黄特色大片免费播放器图片 | 一本一道久久综合久久 | 特级做a爰片毛片免费69 | 亚洲一区av无码专区在线观看 | 又大又黄又粗又爽的免费视频 | 又大又黄又粗又爽的免费视频 | 欧洲精品码一区二区三区免费看 | 人妻少妇精品无码专区二区 | 少妇人妻大乳在线视频 | 亚洲一区二区观看播放 | 国产在线一区二区三区四区五区 | 色情久久久av熟女人妻网站 | 久久久成人毛片无码 | 久久熟妇人妻午夜寂寞影院 | 性欧美牲交xxxxx视频 | 骚片av蜜桃精品一区 | 99国产精品白浆在线观看免费 | 精品无码一区二区三区的天堂 | 国产午夜手机精彩视频 | 国产性生大片免费观看性 | 性史性农村dvd毛片 | 人妻有码中文字幕在线 | 亚洲国产精品无码一区二区三区 | 97无码免费人妻超级碰碰夜夜 | 国产香蕉尹人视频在线 | 欧美 日韩 人妻 高清 中文 | 国产熟妇另类久久久久 | 免费无码av一区二区 | 性欧美熟妇videofreesex | 久久综合狠狠综合久久综合88 | 久久久久se色偷偷亚洲精品av | 国产真实夫妇视频 | 亚欧洲精品在线视频免费观看 | 久久精品人人做人人综合 | 奇米影视7777久久精品 | 天堂亚洲2017在线观看 | av香港经典三级级 在线 | 亚洲国产精品久久人人爱 | 日本大香伊一区二区三区 | 国产一区二区三区精品视频 | 国产成人综合在线女婷五月99播放 | 激情五月综合色婷婷一区二区 | 无码福利日韩神码福利片 | 亚洲精品无码国产 | 日本精品高清一区二区 | 女高中生第一次破苞av | 熟女少妇人妻中文字幕 | 欧美乱妇无乱码大黄a片 | 六月丁香婷婷色狠狠久久 | 曰本女人与公拘交酡免费视频 | 成年美女黄网站色大免费全看 | 国産精品久久久久久久 | 国产性生交xxxxx无码 | 久久久久亚洲精品中文字幕 | 欧美人与禽zoz0性伦交 | 国产无av码在线观看 | 麻豆国产人妻欲求不满 | 欧美国产日韩久久mv | 夜先锋av资源网站 | 国产一区二区三区日韩精品 | 无码国模国产在线观看 | 国产真人无遮挡作爱免费视频 | 国产精品久免费的黄网站 | 男女下面进入的视频免费午夜 | 精品乱子伦一区二区三区 | 精品久久久久久人妻无码中文字幕 | 夜夜影院未满十八勿进 | 亚洲精品久久久久久一区二区 | 成 人 网 站国产免费观看 | 免费国产黄网站在线观看 | 国产疯狂伦交大片 | 国产人妻人伦精品1国产丝袜 | 人人澡人摸人人添 | 少女韩国电视剧在线观看完整 | 成人精品一区二区三区中文字幕 | 精品人人妻人人澡人人爽人人 | 国内老熟妇对白xxxxhd | 久久午夜无码鲁丝片午夜精品 | 中文字幕色婷婷在线视频 | 亚洲а∨天堂久久精品2021 | 国产香蕉97碰碰久久人人 | 国产精品无码久久av | 国产欧美熟妇另类久久久 | 色婷婷av一区二区三区之红樱桃 | 性欧美videos高清精品 | 国产精品无码一区二区三区不卡 | 久久久久久a亚洲欧洲av冫 | 久久成人a毛片免费观看网站 | 亚洲 日韩 欧美 成人 在线观看 | 黑人玩弄人妻中文在线 | 久久国产劲爆∧v内射 | 成人综合网亚洲伊人 | 久久国语露脸国产精品电影 | 强辱丰满人妻hd中文字幕 | 两性色午夜视频免费播放 | 中文字幕人成乱码熟女app | 女人和拘做爰正片视频 | 黑人玩弄人妻中文在线 | 无码人妻黑人中文字幕 | 亚洲精品一区二区三区婷婷月 | 国产亚洲tv在线观看 | 18黄暴禁片在线观看 | 国产精品成人av在线观看 | 国产精品第一国产精品 | 天堂无码人妻精品一区二区三区 | 亚洲 日韩 欧美 成人 在线观看 | 妺妺窝人体色www婷婷 | 国产人妻大战黑人第1集 | 特级做a爰片毛片免费69 | 88国产精品欧美一区二区三区 | 国产人妻人伦精品 | 老司机亚洲精品影院 | 久久精品女人天堂av免费观看 | 人妻少妇精品无码专区二区 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产av剧情md精品麻豆 | 中文字幕人妻无码一夲道 | 免费乱码人妻系列无码专区 | 熟妇激情内射com | 亚洲 另类 在线 欧美 制服 | 国产精品-区区久久久狼 | 蜜臀aⅴ国产精品久久久国产老师 | 日韩无套无码精品 | 永久免费精品精品永久-夜色 | 少妇被粗大的猛进出69影院 | 永久免费观看国产裸体美女 | 国产乱子伦视频在线播放 | 色综合久久中文娱乐网 | 国产性生交xxxxx无码 | 日韩人妻无码一区二区三区久久99 | 无码毛片视频一区二区本码 | 东北女人啪啪对白 | 麻豆精产国品 | 香蕉久久久久久av成人 | 国内精品久久毛片一区二区 | 永久黄网站色视频免费直播 | 精品成在人线av无码免费看 | 国产精品毛片一区二区 | 久久99精品久久久久婷婷 | 动漫av网站免费观看 | 大肉大捧一进一出好爽视频 | 中文字幕色婷婷在线视频 | 精品国产一区二区三区四区 | 欧美人与牲动交xxxx | 免费观看激色视频网站 | 一本久道久久综合狠狠爱 | 午夜无码人妻av大片色欲 | 图片小说视频一区二区 | 亚洲 另类 在线 欧美 制服 | 国产农村乱对白刺激视频 | a片在线免费观看 | 色婷婷久久一区二区三区麻豆 | 日韩精品一区二区av在线 | 在线观看国产一区二区三区 | 久精品国产欧美亚洲色aⅴ大片 | 国产午夜亚洲精品不卡 | 国产在线精品一区二区三区直播 | 亚洲 另类 在线 欧美 制服 | 成人精品视频一区二区三区尤物 | 女人被男人爽到呻吟的视频 | 精品偷拍一区二区三区在线看 | 色欲人妻aaaaaaa无码 | 白嫩日本少妇做爰 | 亚洲中文字幕无码一久久区 | 99久久人妻精品免费二区 | 一本久道久久综合婷婷五月 | 97精品人妻一区二区三区香蕉 | 中文字幕 亚洲精品 第1页 | 在线天堂新版最新版在线8 | 三上悠亚人妻中文字幕在线 | 一本大道伊人av久久综合 | 欧美日韩一区二区免费视频 | 色婷婷久久一区二区三区麻豆 | 97夜夜澡人人双人人人喊 | 无码av最新清无码专区吞精 | 又湿又紧又大又爽a视频国产 | 国产人妻精品一区二区三区不卡 | 国产真实夫妇视频 | 国产精品亚洲综合色区韩国 | 色窝窝无码一区二区三区色欲 | 国产97在线 | 亚洲 | 男女作爱免费网站 | 国产无套内射久久久国产 | 亚洲精品中文字幕久久久久 | 午夜肉伦伦影院 | 伦伦影院午夜理论片 | 日本精品人妻无码免费大全 | 精品无码一区二区三区的天堂 | 日日摸日日碰夜夜爽av | 精品一区二区三区波多野结衣 | 成人亚洲精品久久久久软件 | 无码成人精品区在线观看 | 人妻插b视频一区二区三区 | 亚洲s色大片在线观看 | 少妇无码av无码专区在线观看 | 亚洲无人区一区二区三区 | 丝袜美腿亚洲一区二区 | 国产精品久久久久久亚洲毛片 | 日韩精品乱码av一区二区 | 无码人妻精品一区二区三区不卡 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国产成人无码av在线影院 | 亚洲精品国产精品乱码视色 | 亚洲国产精品无码一区二区三区 | 国产成人精品一区二区在线小狼 | 精品无人区无码乱码毛片国产 | 亚洲一区二区三区含羞草 | 波多野结衣av在线观看 | 高清不卡一区二区三区 | 亚洲乱码中文字幕在线 | 一二三四社区在线中文视频 | 97久久精品无码一区二区 | 四虎4hu永久免费 | 一本加勒比波多野结衣 | a片在线免费观看 | 亚洲精品国产a久久久久久 | 日韩在线不卡免费视频一区 | 中文字幕av伊人av无码av | 四虎国产精品免费久久 | 成年美女黄网站色大免费全看 | 波多野结衣av一区二区全免费观看 | 女人被男人爽到呻吟的视频 | 国产亚洲视频中文字幕97精品 | 久久人人97超碰a片精品 | 日本一区二区三区免费播放 | 久久99精品久久久久久 | 人人妻人人澡人人爽人人精品浪潮 | 亚洲欧美精品伊人久久 | 久激情内射婷内射蜜桃人妖 | a在线观看免费网站大全 | 精品国产一区二区三区四区在线看 | 久久久久久亚洲精品a片成人 | 激情国产av做激情国产爱 | 丝袜足控一区二区三区 | 久久zyz资源站无码中文动漫 | 动漫av一区二区在线观看 | 婷婷五月综合激情中文字幕 | 精品无码一区二区三区爱欲 | 国产情侣作爱视频免费观看 | 日本护士xxxxhd少妇 | 国产色视频一区二区三区 | 精品国产福利一区二区 | 国产亚洲美女精品久久久2020 | 国产精品久久久久久亚洲影视内衣 | 狠狠cao日日穞夜夜穞av | 欧美xxxx黑人又粗又长 | 国产福利视频一区二区 | 精品国产成人一区二区三区 | 国产女主播喷水视频在线观看 | √天堂中文官网8在线 | 亚洲天堂2017无码 | 欧美亚洲日韩国产人成在线播放 | 内射巨臀欧美在线视频 | 国产精品视频免费播放 | 日韩 欧美 动漫 国产 制服 | 日本大香伊一区二区三区 | a国产一区二区免费入口 | 色情久久久av熟女人妻网站 | 久久国语露脸国产精品电影 | 中文字幕av无码一区二区三区电影 | 在线 国产 欧美 亚洲 天堂 | 国产亚洲精品久久久久久 | 免费人成在线观看网站 | 国产尤物精品视频 | 午夜精品久久久久久久久 | 夜夜高潮次次欢爽av女 | 亚洲成a人片在线观看无码 | 国产熟妇高潮叫床视频播放 | 欧美freesex黑人又粗又大 | 日本精品人妻无码77777 天堂一区人妻无码 | 欧美自拍另类欧美综合图片区 | 男人的天堂2018无码 | 日本丰满熟妇videos | 久久99精品国产麻豆蜜芽 | 亚洲成a人片在线观看无码 | 免费看男女做好爽好硬视频 | 精品国产麻豆免费人成网站 | 亚洲爆乳大丰满无码专区 | 精品人妻人人做人人爽 | 色综合视频一区二区三区 | 国内精品久久毛片一区二区 | 国産精品久久久久久久 | 中文字幕 亚洲精品 第1页 | 丰满少妇弄高潮了www | 熟女俱乐部五十路六十路av | 亚洲熟妇色xxxxx亚洲 | 人人妻人人藻人人爽欧美一区 | 久久亚洲中文字幕精品一区 | 俺去俺来也在线www色官网 | 1000部夫妻午夜免费 | 初尝人妻少妇中文字幕 | 亚洲区小说区激情区图片区 | 欧美人与禽zoz0性伦交 | 妺妺窝人体色www婷婷 | 暴力强奷在线播放无码 | 精品国产一区二区三区四区 | 男人的天堂2018无码 | 日韩少妇内射免费播放 | 蜜桃视频韩日免费播放 | 国产人妻精品午夜福利免费 | 久久亚洲精品成人无码 | 成 人 网 站国产免费观看 | 欧美黑人巨大xxxxx | 性生交片免费无码看人 | 无码人妻久久一区二区三区不卡 | 丰满人妻翻云覆雨呻吟视频 | 国内综合精品午夜久久资源 | 国产精品美女久久久网av | 丁香花在线影院观看在线播放 | 无码人妻精品一区二区三区下载 | 日本在线高清不卡免费播放 | 爽爽影院免费观看 | 亚洲综合无码久久精品综合 | 成人免费视频视频在线观看 免费 | 麻豆国产人妻欲求不满 | 国产精品久久福利网站 | 中国女人内谢69xxxx | 亚洲春色在线视频 | 沈阳熟女露脸对白视频 | 国产精品亚洲а∨无码播放麻豆 | 日本一区二区三区免费高清 | 午夜熟女插插xx免费视频 | 国产精品久久久av久久久 | 国产午夜亚洲精品不卡下载 | 99精品无人区乱码1区2区3区 | 人人爽人人澡人人高潮 | 欧美日韩色另类综合 | 沈阳熟女露脸对白视频 | 国产欧美精品一区二区三区 | 色狠狠av一区二区三区 | 久久综合久久自在自线精品自 | 无码吃奶揉捏奶头高潮视频 | 国产成人精品一区二区在线小狼 | 麻豆人妻少妇精品无码专区 | 国产一区二区三区日韩精品 | 亚洲国产精品一区二区美利坚 | 久久人人97超碰a片精品 | 99久久精品日本一区二区免费 | 国产明星裸体无码xxxx视频 | 欧美国产日产一区二区 | 国産精品久久久久久久 | 男人的天堂av网站 | 久久精品无码一区二区三区 | 中文无码成人免费视频在线观看 | 国产精品a成v人在线播放 | 中文字幕人妻丝袜二区 | 无码av岛国片在线播放 | 亚洲精品一区二区三区四区五区 | 两性色午夜视频免费播放 | 人人澡人人妻人人爽人人蜜桃 | 在线观看欧美一区二区三区 | 国产精品第一区揄拍无码 | 鲁一鲁av2019在线 | 中文字幕乱码亚洲无线三区 | 中文字幕无线码免费人妻 | 欧美精品免费观看二区 | 国产精品怡红院永久免费 | 成年美女黄网站色大免费视频 | 人妻夜夜爽天天爽三区 | 99久久精品日本一区二区免费 | 少女韩国电视剧在线观看完整 | 奇米影视7777久久精品人人爽 | 青草青草久热国产精品 | 特级做a爰片毛片免费69 | 国产一区二区三区精品视频 | 男女作爱免费网站 | 午夜福利电影 | а√天堂www在线天堂小说 | 国产三级久久久精品麻豆三级 | 奇米影视7777久久精品人人爽 | 永久免费观看国产裸体美女 | 国产人妻精品一区二区三区 | 日本一卡2卡3卡四卡精品网站 | 色综合久久88色综合天天 | 大地资源网第二页免费观看 | 久在线观看福利视频 | 久久久久99精品国产片 | 久久亚洲国产成人精品性色 | 天干天干啦夜天干天2017 | 亚洲欧美日韩综合久久久 | 国产精品亚洲综合色区韩国 | 熟女少妇在线视频播放 | 女人被男人爽到呻吟的视频 | 日本精品人妻无码77777 天堂一区人妻无码 | 久久久国产精品无码免费专区 | 国产在线精品一区二区高清不卡 | 精品国产青草久久久久福利 | 国内揄拍国内精品人妻 | 日韩欧美中文字幕在线三区 | 鲁一鲁av2019在线 | 国产精品美女久久久 | 国产精品久久久久7777 | 亚洲一区二区观看播放 | 国产麻豆精品一区二区三区v视界 | 色情久久久av熟女人妻网站 | 国产国语老龄妇女a片 | 暴力强奷在线播放无码 | 水蜜桃亚洲一二三四在线 | 日韩人妻少妇一区二区三区 | a国产一区二区免费入口 | 精品国产aⅴ无码一区二区 | 亚洲国产午夜精品理论片 | 国产熟妇另类久久久久 | 人人澡人人妻人人爽人人蜜桃 | 97精品人妻一区二区三区香蕉 | 曰韩少妇内射免费播放 | 久久国语露脸国产精品电影 | 中文字幕乱码亚洲无线三区 | 天海翼激烈高潮到腰振不止 | 玩弄人妻少妇500系列视频 | 伊人色综合久久天天小片 | 又粗又大又硬又长又爽 | 国产凸凹视频一区二区 | 女人被男人躁得好爽免费视频 | 久久精品一区二区三区四区 | 扒开双腿疯狂进出爽爽爽视频 | 在线观看国产一区二区三区 | av小次郎收藏 | 国产精品第一区揄拍无码 | 美女张开腿让人桶 | 久久久久亚洲精品男人的天堂 | 狠狠色欧美亚洲狠狠色www | 久久久久亚洲精品中文字幕 | 中文字幕 人妻熟女 | 亚洲国产精品无码久久久久高潮 | 国产亚洲人成a在线v网站 | 少妇人妻av毛片在线看 | 久久亚洲国产成人精品性色 | 女高中生第一次破苞av | 色诱久久久久综合网ywww | 中文字幕中文有码在线 | 国产综合色产在线精品 | 亚洲综合在线一区二区三区 | 水蜜桃亚洲一二三四在线 | 日本精品人妻无码免费大全 | 欧美老妇交乱视频在线观看 | 一本精品99久久精品77 | 性色欲网站人妻丰满中文久久不卡 | 亚洲 欧美 激情 小说 另类 | 国产精品人人妻人人爽 | 99精品国产综合久久久久五月天 | 97夜夜澡人人爽人人喊中国片 | 亚洲成色www久久网站 | 无码福利日韩神码福利片 | 国产真人无遮挡作爱免费视频 | 扒开双腿疯狂进出爽爽爽视频 | 婷婷丁香六月激情综合啪 | 免费无码肉片在线观看 | 成熟妇人a片免费看网站 | 国产麻豆精品一区二区三区v视界 | yw尤物av无码国产在线观看 | 一本色道久久综合狠狠躁 | 国产无遮挡吃胸膜奶免费看 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 久久国产精品精品国产色婷婷 | 亚洲爆乳无码专区 | 中文字幕人妻丝袜二区 | 国产后入清纯学生妹 | 亚洲日韩乱码中文无码蜜桃臀网站 | 中文毛片无遮挡高清免费 | 少妇人妻偷人精品无码视频 | 麻豆国产人妻欲求不满谁演的 | 日韩在线不卡免费视频一区 | 国产在线aaa片一区二区99 | 丰满肥臀大屁股熟妇激情视频 | 亚洲爆乳无码专区 | 国产精品办公室沙发 | 无遮挡国产高潮视频免费观看 | 成人无码影片精品久久久 | 免费观看又污又黄的网站 | 精品偷自拍另类在线观看 | 55夜色66夜色国产精品视频 | 日日橹狠狠爱欧美视频 | 亚洲a无码综合a国产av中文 | 正在播放东北夫妻内射 | 久久久中文久久久无码 | 丰满人妻被黑人猛烈进入 | 日本一卡二卡不卡视频查询 | 亚洲一区av无码专区在线观看 | 国产特级毛片aaaaaa高潮流水 | 六月丁香婷婷色狠狠久久 | 色一情一乱一伦一视频免费看 | 国产美女精品一区二区三区 | 精品久久久无码中文字幕 | 丰满人妻精品国产99aⅴ | 国内揄拍国内精品少妇国语 | 少妇性荡欲午夜性开放视频剧场 | 黑人巨大精品欧美一区二区 | 日韩欧美中文字幕在线三区 | 亚洲欧美日韩国产精品一区二区 | 国产无遮挡又黄又爽又色 | 久久这里只有精品视频9 | 国产精品人人爽人人做我的可爱 | 三上悠亚人妻中文字幕在线 | 大地资源中文第3页 | 日韩精品a片一区二区三区妖精 | 麻豆md0077饥渴少妇 | 国产黄在线观看免费观看不卡 | 亚洲精品欧美二区三区中文字幕 | 免费无码午夜福利片69 | 精品国产一区二区三区四区 | 天天拍夜夜添久久精品 | 99久久99久久免费精品蜜桃 | 在线亚洲高清揄拍自拍一品区 | 欧美日韩久久久精品a片 | 天天摸天天碰天天添 | 2020久久超碰国产精品最新 | 窝窝午夜理论片影院 | 伊人久久大香线焦av综合影院 | 久久亚洲中文字幕精品一区 | 国产手机在线αⅴ片无码观看 | 国产成人综合色在线观看网站 | www成人国产高清内射 | 人人超人人超碰超国产 | 伊人久久大香线焦av综合影院 | 乌克兰少妇性做爰 | 欧美35页视频在线观看 | 奇米影视7777久久精品 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 无码成人精品区在线观看 | 国产免费观看黄av片 | 国内少妇偷人精品视频 | 成 人 免费观看网站 | 青草视频在线播放 | 又大又硬又黄的免费视频 | 欧美乱妇无乱码大黄a片 | 欧美人与禽猛交狂配 | 成人一在线视频日韩国产 | 精品国产精品久久一区免费式 | 扒开双腿吃奶呻吟做受视频 | av香港经典三级级 在线 | 国产无av码在线观看 | 国产va免费精品观看 | 亚洲国产精品一区二区第一页 | 无码免费一区二区三区 | 无码av免费一区二区三区试看 | 人妻少妇精品无码专区二区 | 午夜福利试看120秒体验区 | 中文无码成人免费视频在线观看 | 亚洲无人区一区二区三区 | 暴力强奷在线播放无码 | 377p欧洲日本亚洲大胆 | 色婷婷综合中文久久一本 | 欧洲精品码一区二区三区免费看 | 久久久久国色av免费观看性色 | 久久无码中文字幕免费影院蜜桃 | 天堂一区人妻无码 | 综合人妻久久一区二区精品 | 日本熟妇浓毛 | 亚洲午夜久久久影院 | 国精产品一品二品国精品69xx | 一本久久a久久精品亚洲 | 两性色午夜免费视频 | 少妇无码av无码专区在线观看 | 欧美成人家庭影院 | 免费无码一区二区三区蜜桃大 | 内射爽无广熟女亚洲 | 国产欧美亚洲精品a | 国产亚洲欧美在线专区 | 青青青爽视频在线观看 | 亚洲精品一区三区三区在线观看 | 欧美黑人性暴力猛交喷水 | 日本熟妇人妻xxxxx人hd | 一区二区三区高清视频一 | 黑森林福利视频导航 | 天堂亚洲免费视频 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产艳妇av在线观看果冻传媒 | 亚洲中文字幕va福利 | 天天爽夜夜爽夜夜爽 | 成人性做爰aaa片免费看不忠 | 欧美丰满熟妇xxxx性ppx人交 | 国产成人综合在线女婷五月99播放 | 无码帝国www无码专区色综合 | 久久久久国色av免费观看性色 | 色五月丁香五月综合五月 | 国内老熟妇对白xxxxhd | 色噜噜亚洲男人的天堂 | 人妻夜夜爽天天爽三区 | 熟女少妇人妻中文字幕 | 任你躁在线精品免费 | 97无码免费人妻超级碰碰夜夜 | 亚洲欧美色中文字幕在线 | 中文亚洲成a人片在线观看 | 亚洲欧美国产精品久久 | 18黄暴禁片在线观看 | 久久国内精品自在自线 | 老熟妇仑乱视频一区二区 | 欧美亚洲国产一区二区三区 | 午夜男女很黄的视频 | 又湿又紧又大又爽a视频国产 | 国产偷国产偷精品高清尤物 | 亚洲精品成人av在线 | 国产亲子乱弄免费视频 | 欧美国产日韩久久mv | 精品久久久久久亚洲精品 | 好爽又高潮了毛片免费下载 | 色窝窝无码一区二区三区色欲 | 漂亮人妻洗澡被公强 日日躁 | 成人精品天堂一区二区三区 | 欧美性生交xxxxx久久久 | 成人欧美一区二区三区黑人免费 | 中文字幕人妻丝袜二区 | 无码av免费一区二区三区试看 | 国产又爽又黄又刺激的视频 | 国产av剧情md精品麻豆 | 亚洲中文字幕无码中文字在线 | 兔费看少妇性l交大片免费 | 天干天干啦夜天干天2017 | 精品少妇爆乳无码av无码专区 | 欧美喷潮久久久xxxxx | 99久久精品国产一区二区蜜芽 | 日本熟妇人妻xxxxx人hd | 久久综合给合久久狠狠狠97色 | 欧美日韩亚洲国产精品 | 国产精品成人av在线观看 | 久久久久久久人妻无码中文字幕爆 | 国产av久久久久精东av | 少妇无码av无码专区在线观看 | 妺妺窝人体色www在线小说 | 最近免费中文字幕中文高清百度 | 中文字幕日产无线码一区 |