日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

jpa mysql乐观锁_【快学springboot】8.JPA乐观锁OptimisticLocking

發(fā)布時(shí)間:2023/12/10 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jpa mysql乐观锁_【快学springboot】8.JPA乐观锁OptimisticLocking 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

介紹

當(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。