八、单机事务

针对单机事务,这里一些特性借鉴了spring的@Transactional注解,事务有很多特性:只读性,隔离性,传播性,我们这里只暴露只读和隔离,其中传播性默认为如果事务不存在,则创建,否则加入到已经存在的事务中。针对事务,这里增加这么个函数(函数名有借鉴)

public void tx(Runnable runnable) {}
public <T> T tx(Supplier<T> supplier) {}
public <T> T tx(Boolean readOnly, Supplier<T> supplier) {}
public void tx(Boolean readOnly, Runnable runnable) {}
public void tx(TxIsolationEnum isolationEnum, Runnable runnable) {}
public <T> T tx(TxIsolationEnum isolationEnum, Supplier<T> supplier) {}
public void tx(TxIsolationEnum isolationEnum, Boolean readOnly, Runnable runnable) {}
public <T> T tx(TxIsolationEnum isolationEnum, Boolean readOnly, Supplier<T> supplier){}

参数

类型

详解

runnable

Runnable

无返回值的执行

supplier

Supplier

有返回值类型T的事务执行

isolationEnum

TxIsolationEnum

隔离级别枚举:读未提交,读提交,可重复读,序列化

readOnly

Boolean

true:表示该事务是只读事务,false:表示为普通事务

1.事务只读

对于事务中有多个读操作的这种,我们可以对事务添加只读,那么为什么添加只读事务,网上说了很多是在一个事务中有多个读操作,为了前后读取的一致性,才添加只读事务的。我的理解不是这样,我觉得mysql事务的默认隔离级别是不可重复,其实就是在一个事务中,前后读取就是保持一致的。那么什么时候添加只读呢,由于在事务中,根据事务中的读写,增加了各种隔离级别,随着级别越来越高,则耗费的数据库资源也越多,很多都是根据写操作设置的,但是如果我们事务中只有读,则没有必要再耗费那么多资源,因此可以开启只读按钮,用于优化事务。 示例:

/**
* 只读事务
*/
@Test
public void test5(){
  AtomicReference<List<String>> groupList = new AtomicReference<>();
  AtomicReference<List<String>> nameList = new AtomicReference<>();
  neo.tx(true, ()->{
    groupList.set(neo.values(TABLE_NAME, "group"));
    nameList.set(neo.values(TABLE_NAME, "name"));
  });

  // [12, group555]
  show(groupList);
  // [name333]
  show(nameList);
}

2.事务隔离

事务的隔离级别,这里设置了枚举添加了自定义的枚举

示例:

Last updated

Was this helpful?