Browse Source
Introduces infrastructure to obtain locks and uses them to acquire locks on the table of the aggregate root before deleting references. Without this lock deletes access non root entities before the aggregate root, which is the opposite order of updates and thus may cause deadlocks. Original pull request: #196.pull/216/head
42 changed files with 1364 additions and 57 deletions
@ -0,0 +1,55 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2020 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package org.springframework.data.relational.core.dialect; |
||||||
|
|
||||||
|
import org.springframework.data.relational.core.sql.LockOptions; |
||||||
|
|
||||||
|
/** |
||||||
|
* A clause representing Dialect-specific {@code LOCK}. |
||||||
|
* |
||||||
|
* @author Myeonghyeon Lee |
||||||
|
* @since 2.0 |
||||||
|
*/ |
||||||
|
public interface LockClause { |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the {@code LOCK} clause to lock results. |
||||||
|
* |
||||||
|
* @param lockOptions contains the lock mode to apply. |
||||||
|
* @return rendered lock clause. |
||||||
|
*/ |
||||||
|
String getLock(LockOptions lockOptions); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the {@link Position} where to apply the {@link #getLock(LockOptions) clause}. |
||||||
|
*/ |
||||||
|
Position getClausePosition(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Enumeration of where to render the clause within the SQL statement. |
||||||
|
*/ |
||||||
|
enum Position { |
||||||
|
/** |
||||||
|
* Append the clause after from table. |
||||||
|
*/ |
||||||
|
AFTER_FROM_TABLE, |
||||||
|
|
||||||
|
/** |
||||||
|
* Append the clause at the end of the statement. |
||||||
|
*/ |
||||||
|
AFTER_ORDER_BY |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,27 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2020 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package org.springframework.data.relational.core.sql; |
||||||
|
|
||||||
|
/** |
||||||
|
* Lock Mode Types of SELECT statements. |
||||||
|
* |
||||||
|
* @author Myeonghyeon Lee |
||||||
|
* @since 2.0 |
||||||
|
*/ |
||||||
|
public enum LockMode { |
||||||
|
PESSIMISTIC_READ, |
||||||
|
PESSIMISTIC_WRITE |
||||||
|
} |
||||||
@ -0,0 +1,40 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2020 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package org.springframework.data.relational.core.sql; |
||||||
|
|
||||||
|
/** |
||||||
|
* LockOptions has a LOCK option to apply to the Select statement. |
||||||
|
* |
||||||
|
* @author Myeonghyeon Lee |
||||||
|
* @since 2.0 |
||||||
|
*/ |
||||||
|
public class LockOptions { |
||||||
|
private final LockMode lockMode; |
||||||
|
private final From from; |
||||||
|
|
||||||
|
public LockOptions(LockMode lockMode, From from) { |
||||||
|
this.lockMode = lockMode; |
||||||
|
this.from = from; |
||||||
|
} |
||||||
|
|
||||||
|
public LockMode getLockMode() { |
||||||
|
return this.lockMode; |
||||||
|
} |
||||||
|
|
||||||
|
public From getFrom() { |
||||||
|
return this.from; |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue