事务
- 为了能够让
Connection能够被及时回收,SqlFly采用用完即释的策略,即:在每一次执行sql后将立刻释放Connection - 在开启事务后,
用完即释模式将被关闭,直至你提交或者回滚事务后,Connection才会被释放 - 有些时候,我们希望sql根据业务进行提交或回滚,也需要用到事务
开启事务
调用 beginTransaction() 开启事务
// 测试5-1 开启事务@Testpublic void test5_1() {SqlFly sqlFly = SqlFlyFactory.getSqlFly();try {sqlFly.beginTransaction(); // 开启事务sqlFly.getUpdate("insert into sys_user values()"); // 执行一条会失败的sqlsqlFly.commit(); // 提交事务System.out.println("事务提交成功");} catch (Exception e) {sqlFly.rollback(); // 回滚事务System.out.println("事务提交失败,已回滚");e.printStackTrace();}}
开始事务 - lambda表达式方式
- 如果你的jdk版本为1.8或以上,那么使用以下lambda方式开启事务将会让你的代码更加优雅,
- 如果你的jdk版本低于1.8,那么强烈建议你升级至1.8或以上
@Testpublic void test5_2() {SqlFly sqlFly = SqlFlyFactory.getSqlFly();sqlFly.begin(()->{ // SqlFly将在开启事务后,再调用此代码块System.out.println("事务已被开启");sqlFly.getUpdate("insert into sys_user values()"); // 执行一条会失败的sql}, (e)->{ // 事务发生异常后,SqlFly将回滚事务后,再调用此代码块System.out.println("事务已被回滚");e.printStackTrace();});}
- begin()方法接受两个参数
- 第一个参数为
begin 代码块,SqlFly会在开启事务后调用 - 第二个参数为
rollback 代码块,SqlFly会在begin 代码块发生异常并回滚事务后调用 - begin()方法有一个重载,只需要传入 一个
begin 代码块就可以了,这时候begin 代码块内抛出的异常将不会被自动捕获,需要你手动捕捉并回滚事务
开始事务 - lambda表达式方式,并接收一个返回值
- 在java的
lambda表达式中是不能为表达式之外的变量赋值的,如果我们想把一个值从lambda表达式内部带出来,应该怎么办?// 测试5-3 开启事务 lambda表达式, 并指定返回值@Testpublic void test5_3() {SqlFly sqlFly = SqlFlyFactory.getSqlFly();String return_obj = sqlFly.beginRT(() -> { // SqlFly将在开启事务后,再调用此代码块System.out.println("事务已被开启");sqlFly.getUpdate("insert into sys_user values()"); // 执行一条会失败的sqlreturn "这是返回的值,可以是任意类型";}, (e) -> { // 事务发生异常后,SqlFly将回滚事务后,再调用此代码块System.out.println("事务已被回滚");e.printStackTrace();return "这是返回的值,可以是任意类型";});System.out.println("返回的值:" + return_obj);}
- 如上,
beginRT()方法的用法与begin()基本一致,不同点就在于beginRT()是可以带返回值的, - 而且这个返回值并不局限于一个类型,它的类型取决于你用什么类型的变量去接受它(没错,就是这么神奇)
