Neo
  • 简介
  • 一、数据库连接
  • ​二、基本功能
    • 增加
    • 删除
    • 修改
    • 查询
    • 其他查询
  • 三、结构信息
  • 四、批量功能
  • 五、NeoMap类
    • NeoMap初始化
    • NeoMap和JavaBean转换
    • NeoMap和NeoMap转换
    • 其他功能
  • 六、命名转换
  • 七、Columns类
  • 八、单机事务
  • 九、sql监控
  • 十、主从
  • 十一、join
  • 十二、实体代码生成器
  • 十三、sql特殊处理
  • 十四、分布式
    • 全局id
    • 分布式锁
    • 分布式事务(待开发)
  • 十五、动态分库分表(待开发)
  • 十六、多数据源(待开发)
    • sqlLite
    • PostGresql
  • 十七、设计说明
  • 十八、版本记录
Powered by GitBook
On this page
  • 1.事务只读
  • 2.事务隔离

Was this helpful?

八、单机事务

针对单机事务,这里一些特性借鉴了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.事务隔离

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

@Getter
@AllArgsConstructor
public enum TxIsolationEnum {

    /**
     * 一个常量,指示防止脏读;可以发生不可重复的读取和幻像读取
     */
    TX_R_U(Connection.TRANSACTION_READ_COMMITTED),
    /**
     * 一个常量,表示可以进行脏读,不可重复读和幻像读
     */
    TX_R_C(Connection.TRANSACTION_READ_COMMITTED),
    /**
     * 一个常量,表示禁止脏读和不可重复读;可以发生幻像读取
     */
    TX_R_R(Connection.TRANSACTION_REPEATABLE_READ),
    /**
     * 一个常量,表示防止脏读,不可重复读和幻像读
     */
    TX_SE(Connection.TRANSACTION_SERIALIZABLE);

    private int level;
}

示例:

/**
 * 事务的隔离级别
 */
@Test
public void test6(){
  // {age=2, group=kk, id=11, name=name333}
  show(neo.tx(TxIsolationEnum.TX_R_R, ()->{
    neo.update(TABLE_NAME, NeoMap.of("group", "kk"), NeoMap.of("id", 11));
    return neo.one(TABLE_NAME, NeoMap.of("id", 11));
  }));
}
Previous七、Columns类Next九、sql监控

Last updated 5 years ago

Was this helpful?