我在aws的innodb实例中获得了锁定。支持说一切都完整无缺(明智的基础设施建设) 每当我跑步时:
Event event = eventRdb.getObjectById(event_id, Event.class, true);
event = eventApi.leave(event, user); //this method is below
我得到一个锁定等待,请重新启动事务,锁定的表是“用户”表。 我关闭了lucene,以为这可能是罪魁祸首,但仍然锁定。 查看事务,似乎用户表已被锁定并卡在那里。
public Event leave(
Event event,
User paticipant
) throws CatchappException {
if (!event.getParticipants().contains(paticipant)) {
throw new CatchappException("Participant is not currently going to Event.");
}
event.getParticipants().remove(paticipant); //this part doesn't remove the participant.
eventRdb.updateObject(event);
if (event.getState().equals(EventState.happening)) {
event = deleteIfNoUsers(event);
} else {
event = updateEventStatus(event, false);
}
MqttApi mqttApi = Config.injector.getInstance(MqttApi.class);
// send chat
Chat chat = chatApi.getOrCreateChat(ChatType.event, event);
try {
chatApi.addMessage(chat,
paticipant,
paticipant.getNickname() + " left this event", MessageType.text, mqttApi);
} catch (Exception e) {
e.printStackTrace();
}
return event;
}
由于某种原因,在调用此函数时,在数据库中它显示了一个在用户上运行更新的事务,即使我没有调用它。
参与者渴望获得。
我在用户类上使用了lucene:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "user",
uniqueConstraints = {
@UniqueConstraint(columnNames = {"username"})
},
indexes = {
@Index(columnList = "unique_id", name = "user_unique_id_idx")
}
)
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@Indexed
@AnalyzerDef(name = "customanalyzer",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = SnowballPorterFilterFactory.class),
@TokenFilterDef(factory = StandardFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = StopFilterFactory.class),
@TokenFilterDef(factory = NGramFilterFactory.class,
params = {
@org.hibernate.search.annotations.Parameter(name = "minGramSize", value = "2"),
@org.hibernate.search.annotations.Parameter(name = "maxGramSize", value = "2")})})
public class User extends Persistent {
public static final int FLAG_NONE_ROLE = 0;
public static final int FLAG_USER_ROLE = 1;
public static final int FLAG_ADMIN_ROLE = 2;
private int role_flag = 0;
@Field(index = org.hibernate.search.annotations.Index.YES, analyze = Analyze.YES, store = Store.NO, boost = @Boost(2.5f))
@Analyzer(definition = "customanalyzer")
private String first_name = null;
@Field(index = org.hibernate.search.annotations.Index.YES, analyze = Analyze.YES, store = Store.NO)
@Analyzer(definition = "customanalyzer")
private String last_name = null;
@Field(index = org.hibernate.search.annotations.Index.YES, analyze = Analyze.YES, store = Store.NO, boost = @Boost(2f))
@Analyzer(definition = "customanalyzer")
private String username = null;
private String password = null;
private String email = null;
private String phone = null;
private String phone_normalized = null;
private String bio = null;
private String website = null;
private String address_street_1 = null;
private String address_street_2 = null;
private String city = null;
private String state = null;
private String country = null;
private String zip_code = null;
@Field(index = org.hibernate.search.annotations.Index.YES, analyze = Analyze.YES, store = Store.NO)
private String image_url = null;
private Set<Device> devices = new HashSet<>();
@Convert(converter = LocalDatePersistenceConverter.class)
private LocalDate dob = null;
private Boolean smoker = false;
private String hometown = null;
private Gender gender = null;
private Set<Language> languages = new HashSet<>();
private Set<Event> events = new HashSet<>();
private Long facebook_id = null;
private String facebook_token = null;
private String google_id = null;
private String google_access_token = null;
private String google_refresh_token = null;
private DistanceUnit distance_unit = DistanceUnit.mile;
private String external_code = null;
private Integer num_completed_events = 0;
private String timezone = null;
private String verification_code = null;
private ViewStatus view_status = null;
@Field(index = org.hibernate.search.annotations.Index.YES, analyze = Analyze.NO, store = Store.NO)
private Boolean verified = false;
private Boolean needs_password_change = false;
private Set<UserActivity> activity_profiles = new HashSet<>();
private Set<Contact> contacts = new HashSet<>();
private Boolean email_sent = false;
private Set<Media> likes;
private Set<Post> postLikes = null;
private String api_version = "1";
private Set<Post> posts = null;
private Membership membership = null;
private Boolean new_user = true;
@Transient
public String getNickname() {
String nickname = "CatchApp User";
try {
if ((this.getFirst_name() != null) && (this.getLast_name() != null)) {
nickname = this.getFirst_name() + " " + this.getLast_name().substring(0, 1) + ".";
} else if (this.getFirst_name() != null) {
nickname = this.getFirst_name();
} else if (this.getLast_name() != null) {
nickname = this.getLast_name();
}
} catch (Exception e) {
// eat it
}
return nickname;
}
@Transient
public String getDisplayName() {
return getNickname();
}
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
@IndexedEmbedded
public Set<UserActivity> getActivity_profiles() {
return activity_profiles;
}
public void setActivity_profiles(Set<UserActivity> activity_profiles) {
this.activity_profiles = activity_profiles;
}
public String getVerification_code() {
return verification_code;
}
public void setVerification_code(String verification_code) {
this.verification_code = verification_code;
}
@Type(type = "org.hibernate.type.NumericBooleanType")
public Boolean getVerified() {
return verified;
}
public void setVerified(Boolean verified) {
this.verified = verified;
}
@Type(type = "org.hibernate.type.NumericBooleanType")
public Boolean getNeeds_password_change() {
return needs_password_change;
}
public void setNeeds_password_change(Boolean needs_password_change) {
this.needs_password_change = needs_password_change;
}
public String getTimezone() {
return timezone;
}
public void setTimezone(String timezone) {
this.timezone = timezone;
}
public Integer getNum_completed_events() {
return num_completed_events;
}
public void setNum_completed_events(Integer num_completed_events) {
this.num_completed_events = num_completed_events;
}
public String getExternal_code() {
return external_code;
}
public void setExternal_code(String external_code) {
this.external_code = external_code;
}
@Transient
public boolean isAdminRole() {
return ((this.getRole_flag() & User.FLAG_ADMIN_ROLE) == User.FLAG_ADMIN_ROLE);
}
@Transient
public boolean isUserRole() {
return ((this.getRole_flag() & User.FLAG_USER_ROLE) == User.FLAG_USER_ROLE);
}
@Enumerated(EnumType.STRING)
public DistanceUnit getDistance_unit() {
return distance_unit;
}
public void setDistance_unit(DistanceUnit distance_unit) {
this.distance_unit = distance_unit;
}
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "event_participant_join", joinColumns = @JoinColumn(name = "participant_id"), inverseJoinColumns = @JoinColumn(name = "event_id"))
public Set<Event> getEvents() {
return events;
}
public void setEvents(Set<Event> events) {
this.events = events;
}
public int getRole_flag() {
return role_flag;
}
public void setRole_flag(int role_flag) {
this.role_flag = role_flag;
}
public String getFirst_name() {
return first_name;
}
public void setFirst_name(String first_name) {
this.first_name = first_name;
}
public String getLast_name() {
return last_name;
}
public void setLast_name(String last_name) {
this.last_name = last_name;
}
@Column(name = "username", nullable = true, length = 64)
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPhone_normalized() {
return phone_normalized;
}
public void setPhone_normalized(String phone_normalized) {
this.phone_normalized = phone_normalized;
}
@Column(columnDefinition = "TEXT")
public String getBio() {
return bio;
}
public void setBio(String bio) {
this.bio = bio;
}
public String getAddress_street_1() {
return address_street_1;
}
public void setAddress_street_1(String address_street_1) {
this.address_street_1 = address_street_1;
}
public String getAddress_street_2() {
return address_street_2;
}
public void setAddress_street_2(String address_street_2) {
this.address_street_2 = address_street_2;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getZip_code() {
return zip_code;
}
public void setZip_code(String zip_code) {
this.zip_code = zip_code;
}
public String getImage_url() {
return image_url;
}
public void setImage_url(String image_url) {
this.image_url = image_url;
}
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
public Set<Device> getDevices() {
return devices;
}
@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
public Set<Contact> getContacts() {
return contacts;
}
public void setContacts(Set<Contact> contacts) {
this.contacts = contacts;
}
public void setDevices(Set<Device> devices) {
this.devices = devices;
}
// @Temporal(TemporalType.DATE)
public LocalDate getDob() {
return dob;
}
public void setDob(LocalDate dob) {
this.dob = dob;
}
@Type(type = "org.hibernate.type.NumericBooleanType")
public Boolean getSmoker() {
return smoker;
}
public void setSmoker(Boolean smoker) {
this.smoker = smoker;
}
public String getHometown() {
return hometown;
}
public void setHometown(String hometown) {
this.hometown = hometown;
}
@Enumerated(EnumType.STRING)
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "user_language_join", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "language_id"))
public Set<Language> getLanguages() {
return languages;
}
public void setLanguages(Set<Language> languages) {
this.languages = languages;
}
public Long getFacebook_id() {
return facebook_id;
}
public void setFacebook_id(Long facebook_id) {
this.facebook_id = facebook_id;
}
@Column(columnDefinition = "TEXT")
public String getFacebook_token() {
return facebook_token;
}
public void setFacebook_token(String facebook_token) {
this.facebook_token = facebook_token;
}
public String getGoogle_id() {
return google_id;
}
public void setGoogle_id(String google_id) {
this.google_id = google_id;
}
public String getGoogle_access_token() {
return google_access_token;
}
public void setGoogle_access_token(String google_access_token) {
this.google_access_token = google_access_token;
}
public String getGoogle_refresh_token() {
return google_refresh_token;
}
public void setGoogle_refresh_token(String google_refresh_token) {
this.google_refresh_token = google_refresh_token;
}
public String getWebsite() {
return website;
}
public void setWebsite(String website) {
this.website = website;
}
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "user_likes_join",
joinColumns = {@JoinColumn(name = "user_id")},
inverseJoinColumns = {@JoinColumn(name = "media_id")}
)
public Set<Media> getLikes() {
return likes;
}
public void setLikes(Set<Media> likes) {
this.likes = likes;
}
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "post_likes_join",
joinColumns = {@JoinColumn(name = "user_id")},
inverseJoinColumns = {@JoinColumn(name = "post_id")}
)
public Set<Post> getPostLikes() {
return postLikes;
}
public void setPostLikes(Set<Post> postLikes) {
this.postLikes = postLikes;
}
public String getApi_version() {
return api_version;
}
public void setApi_version(String api_version) {
this.api_version = api_version;
}
@Type(type = "org.hibernate.type.NumericBooleanType")
public Boolean getEmail_sent() {
return email_sent;
}
...
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "event",
indexes = {
@Index(columnList = "unique_id", name = "event_unique_id_idx")
}
)
public class Event extends Persistent {
private EventType type = null;
private CostType cost_type = null;
private Activity activity = null;
private Double cost = null;
private String currency = null;
private Integer creator_age = null;
private Integer creator_level = null;
private Integer event_level = null; // for trainer course only
private User creator = null;
@Convert(converter = LocalDateTimePersistenceConverter.class)
private LocalDateTime start_date = null;
@Convert(converter = LocalDateTimePersistenceConverter.class)
private LocalDateTime end_date = null;
private String description = null; //a.k.a. description ?
private EventState state = null;
private Gender gender = null;
private Boolean membership_required = false;
private Boolean trainer_event = false;
private Double latitude = null;
private Double longitude = null;
private Double randomized_latitude = null;
private Double randomized_longitude = null;
private Boolean reminded = false;
private Boolean shareable = false;
//
private String location_description = null;
private Set<User> participants = new HashSet<>();
private Set<EventRequest> requests = new HashSet<>();
private Set<EventInvitation> invitations = new HashSet<>();
private Integer participants_min = null;
private Integer participants_max = null;
// private Integer participants_required = null;
private Double distance = null;
private String address_street_1 = null;
private String address_street_2 = null;
private String city = null;
private String st = null;
private String country = null;
private String zip_code = null;
private String external_code = null;
private Boolean manually_confirmed = false;
// private Boolean notified_will_expire = false;
private Boolean accept_automatically = false;
private String title = null;
private Boolean is_full = false;
private String date_label = null;
private Boolean is_spot = false;
private Set<Media> pictures = new HashSet<>(); // up 4 images
private String header = null; //first picture of pictures or profile picture
private String spot_id = null;
private LocationType location_type = null;
private Boolean all_day = false;
private ViewStatus view_status = null;
@Transient
public String getDisplayLocation() {
if (location_description != null) {
return location_description;
}
if ((city != null) && (state != null)) {
return "near " + city + ", " + st;
} else if (city != null) {
return "near " + city;
} else if (state != null) {
return "near " + st;
}
if (country != null)
return "near " + country;
return "";
}
@Enumerated(EnumType.STRING)
public LocationType getLocation_type() {
return location_type;
}
public void setLocation_type(LocationType location_type) {
this.location_type = location_type;
}
public Boolean getIs_full() {
return is_full;
}
public void setIs_full(Boolean is_full) {
this.is_full = is_full;
}
public Boolean getIs_spot() {
return is_spot;
}
public void setIs_spot(Boolean is_spot) {
this.is_spot = is_spot;
}
public String getHeader() {
return header;
}
public void setHeader(String header) {
this.header = header;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Type(type = "org.hibernate.type.NumericBooleanType")
public Boolean getAccept_automatically() {
return accept_automatically;
}
public void setAccept_automatically(Boolean accept_automatically) {
this.accept_automatically = accept_automatically;
}
public Double getRandomized_latitude() {
return randomized_latitude;
}
public void setRandomized_latitude(Double randomized_latitude) {
this.randomized_latitude = randomized_latitude;
}
public Double getRandomized_longitude() {
return randomized_longitude;
}
public void setRandomized_longitude(Double randomized_longitude) {
this.randomized_longitude = randomized_longitude;
}
public String getExternal_code() {
return external_code;
}
public void setExternal_code(String external_code) {
this.external_code = external_code;
}
public String getAddress_street_1() {
return address_street_1;
}
public void setAddress_street_1(String address_street_1) {
this.address_street_1 = address_street_1;
}
public String getAddress_street_2() {
return address_street_2;
}
public void setAddress_street_2(String address_street_2) {
this.address_street_2 = address_street_2;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getSt() {
return st;
}
public void setSt(String st) {
this.st = st;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getZip_code() {
return zip_code;
}
public void setZip_code(String zip_code) {
this.zip_code = zip_code;
}
@Transient
public Double getDistance() {
return distance;
}
public void setDistance(Double distance) {
this.distance = distance;
}
public Integer getEvent_level() {
return event_level;
}
public void setEvent_level(Integer event_level) {
this.event_level = event_level;
}
@Enumerated(EnumType.STRING)
public EventType getType() {
return type;
}
public void setType(EventType type) {
this.type = type;
}
@Enumerated(EnumType.STRING)
public CostType getCost_type() {
return cost_type;
}
public void setCost_type(CostType cost_type) {
this.cost_type = cost_type;
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "activity_fk")
public Activity getActivity() {
return activity;
}
public void setActivity(Activity activity) {
this.activity = activity;
}
public Double getCost() {
return cost;
}
public void setCost(Double cost) {
this.cost = cost;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public Integer getCreator_age() {
return creator_age;
}
public void setCreator_age(Integer creator_age) {
this.creator_age = creator_age;
}
public Integer getCreator_level() {
return creator_level;
}
public void setCreator_level(Integer creator_level) {
this.creator_level = creator_level;
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_fk")
public User getCreator() {
return creator;
}
public void setCreator(User creator) {
this.creator = creator;
}
@OneToMany(mappedBy = "event", fetch = FetchType.LAZY)
public Set<Media> getPictures() {
return pictures;
}
public void setPictures(Set<Media> pictures) {
this.pictures = pictures;
}
// @Temporal(TemporalType.TIMESTAMP)
public LocalDateTime getStart_date() {
return start_date;
}
public void setStart_date(LocalDateTime start_date) {
this.start_date = start_date;
}
// @Temporal(TemporalType.TIMESTAMP)
public LocalDateTime getEnd_date() {
return end_date;
}
public void setEnd_date(LocalDateTime end_date) {
this.end_date = end_date;
}
// @Temporal(TemporalType.TIMESTAMP)
// public LocalDateTime getEnd_of_life_date() {
// return end_of_life_date;
// }
//
// public void setEnd_of_life_date(LocalDateTime end_of_life_date) {
// this.end_of_life_date = end_of_life_date;
// }
@Column(columnDefinition = "TEXT")
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Enumerated(EnumType.STRING)
public EventState getState() {
return state;
}
public void setState(EventState state) {
this.state = state;
}
@Enumerated(EnumType.STRING)
public Gender getGender() {
return gender;
...
这是几天前突然开始的事情。仅在某些事件下发生。一旦我致电leave()
,它就会阻止,无法编辑任何事件。