jpa mysql乐观锁_【快学springboot】8.JPA乐观锁OptimisticLocking
介紹
當(dāng)涉及到企業(yè)應(yīng)用程序時(shí),正確地管理對數(shù)據(jù)庫的并發(fā)訪問是至關(guān)重要的。為此,我們可以使用Java Persistence API提供的樂觀鎖定機(jī)制。它導(dǎo)致在同一時(shí)間對同一數(shù)據(jù)進(jìn)行多次更新不會(huì)相互干擾。為了使用OptimisticLocking,我們需要一個(gè)實(shí)體(Entity),其中包含一個(gè)帶有@Version注釋的屬性。在使用它時(shí),每個(gè)讀取數(shù)據(jù)的事務(wù)都持有version屬性的值。在事務(wù)想要進(jìn)行更新之前,它將再次檢查version屬性。如果值在此期間發(fā)生了更改,則拋出ObjectOptimisticLockingFailureException。否則,事務(wù)提交update并遞增version的值。這種機(jī)制適用于讀操作比更新或刪除操作多得多的應(yīng)用程序。
新建一個(gè)UserEntity.java
@Entity
@Table(name = "user")
@Data
@OptimisticLocking
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Integer id;
@Column(name = "username", unique = true, nullable = true, length = 50)
private String username;
private String password;
@Version
private Integer version;
@PrePersist
public void prePersist() {
version = 0;
}
}
spring data jpa在上一篇文章已經(jīng)做過一些講解了【快學(xué)springboot】7.使用Spring Boot Jpa。感興趣的朋友可以看看。這里定義了一個(gè)version字段,使用了Version注解標(biāo)識(shí)。PrePersist這個(gè)注解表示在新增數(shù)據(jù)之前執(zhí)行。
新建UserRepo接口
public interface UserRepo extends PagingAndSortingRepository, JpaSpecificationExecutor {
}
新建一個(gè)UserTest類,繼承SpringbootApplicationTests
public class UserTest extends SpringbootApplicationTests {
}
SpringbootApplicationTests這個(gè)類是使用Spring initialize新建項(xiàng)目的時(shí)候自動(dòng)生成的用來做單元測試的類。在UserTest上注入U(xiǎn)serRepo,并且寫一個(gè)新增user的單測。
執(zhí)行之后查看數(shù)據(jù)庫。
該記錄已經(jīng)被創(chuàng)建出來了。
測試update該記錄
執(zhí)行后查看數(shù)據(jù)庫:
可以看到version字段自增了1。
測試JPA樂觀鎖
新建一個(gè)方法,如下
這里查詢了兩次id為1的記錄,然后分別更新了這條記錄。根據(jù)前面的描述,這里會(huì)拋出一個(gè)ObjectOptimisticLockingFailureException異常。啟動(dòng)測試,結(jié)果如下:
這是符合預(yù)期的。看下數(shù)據(jù)庫的version,在這種情況下,我們的預(yù)期結(jié)果是version變?yōu)?。
通過數(shù)據(jù)庫的值查看,測試都是符合預(yù)期的。
去掉User的OptimisticLocking注解
我們把User實(shí)體的OptimisticLocking注解去掉,然后再次執(zhí)行上面的方法。
這一次程序順利執(zhí)行了,然后查看下數(shù)據(jù)庫的記錄:
預(yù)期應(yīng)該是version會(huì)變?yōu)?,然后username變?yōu)閔appyjava-new2。
通過結(jié)果來看,這是符合預(yù)期的。
總結(jié)
spring data jpa通過OptimisticLocking實(shí)現(xiàn)了樂觀鎖,該樂觀鎖不是通過數(shù)據(jù)庫自身去實(shí)現(xiàn)的,它是通過version字段(需要Version注解標(biāo)識(shí))去實(shí)現(xiàn)的。如果update的數(shù)據(jù)時(shí)候,發(fā)現(xiàn)數(shù)據(jù)庫的version大于等于當(dāng)前的version,則會(huì)拋出ObjectOptimisticLockingFailureException,錯(cuò)誤信息是
Row was updated or deleted by another transaction
總結(jié)
以上是生活随笔為你收集整理的jpa mysql乐观锁_【快学springboot】8.JPA乐观锁OptimisticLocking的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解读HTTP包
- 下一篇: mysql 无法创建表_MYSQL-不能