Skip to main content

SQL 异象

Guan Chao

Guan Chao

全栈工程师

SQL 异象是指:

  • 脏读(Dirty Read)
  • 不可重复读(Non-Repeatable Read)
  • 幻象读(Phantom Read)
  • 脏写(Dirty Write)
  • 读偏移(Read Skew)
  • 写偏移(Write Skew)
  • 丢失更新(Lost Update)

正如这些名称所示,这些现象表示的都是一些数据完整性异常,而导致这些问题的原因就是开发者为了压榨事务并发的性能而放宽了 SERIALIZABLE 隔离等级,使用了其他的隔离等级。

note

在选择事务隔离级别和事务并发性性能之间总是存在权衡。

CascadeType.ALL 的使用及其注意项

Guan Chao

Guan Chao

全栈工程师

CascadeType.ALL 的含义是指持久化上下文会将所有的 EntityManager 操作(PERSIST, REMOVE, REFRESH, MERGEDETACH)传递(级联)给所有与之关联的实体。

具体的 Cascade 类型描述如下:

  • PERSIST:如果父级实体被持久化到持久化上下文中,那么所有相关的实体同样会被持久化。
  • MERGE:如果父级实体合并到持久化上下文中,那么相关的实体都会被合并。
  • REFRESH:如果在当前持久化上下文中刷新了父级实体,那么所有相关的实体都会被刷新。
  • DETACH:如果父级实体脱离当前持久化上下文,那么所有相关的实体都会脱离。
  • REMOVE:如果父级实体从当前的持久化上下文中移除,那么所有相关的实体都会被移除。
  • ALL:所有描述都会被应用到关联的实体上。

级联是最敏感的设置,因为在更新或者删除的时候,常常会发生意外的事情。在 CascadeType.REMOVE 的例子中,有时你希望父级被删除的时候,不要影响子表中的行,特别是在子表还和其他的表存在关联的情况。

TODO

[Reference: Rapid Java Persistence and Microservices]

JPA (Hibernate) 基础

Guan Chao

Guan Chao

全栈工程师

持久化单元是什么?#

可以将持久化单元想象成一个盒子,它里面装下了需要创建一个 EntityManagerFactory 实例所有必要的信息。

Figure A-1. Persistence unit Figure A-1. Persistence unit

这些信息中,有关于数据源的详细信息(JDBC URL,用户名,密码,SQL dialect,等等),被托管的实体列表,以及一些其他的属性。当然,持久化单元类型可以是 本地资源 (单数据源)或者 JTA (多数据源)。你可以通过你设定的名称来区分持久化单元。在同一个应用中,你可以拥有多个持久化单元,然后通过各自的名称来识别,因此,可以在同一个应用中连接不同的数据库。