java--数据库事务

一、jdbc数据库基本操作

https://blog.csdn.net/qq_34577961/article/details/128880831?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22128880831%22%2C%22source%22%3A%22qq_34577961%22%7D

二、事务

事务原则就是一个业务逻辑需要处理一个或者多个数据时,必须保证所有操作完成或者某一个操作失败时,数据恢复到原有的状态。

事务的四个属性:

原子性:可理解为一个整体工作单位,原子则代表不可再拆分的事物,所以同个事务的操作要么都完成,要么都不完成。

一致性:从一个一致状态变更到另一种一致的状态,也可以由原子性得出。

持久性:事务提交后,则数据不再因其他操作发生变更。

隔离性:不同事务互不干扰。

package com.ruqi.prepareStatment;
import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
// 连接的工具类见上篇文章 
// 处理事务,确保所有的操作同一个连接对象即可,因此要把连接对象当作变量上传

public class DealShiWu {

    @Test
    public void updateTest(){
        Connection conn = null;
        try{
            conn = ConnectUtil.getConnection();
            conn.setAutoCommit(false);
            String sql1 = "UPDATE Scores set score = score - 100 where  id = ?;";
//            System.out.println(10 / 0);
            String sql2 = "UPDATE Scores set score = score - 100 where  id = ?;";
            update(conn,sql1,1);
            update(conn,sql2,2);
            conn.commit();
            System.out.println("事务处理成功");
        }catch (Exception exception){
            exception.printStackTrace();
            try{
                conn.rollback();
            }catch (Exception e){
                e.printStackTrace();
            }
        }finally {
            try {
                // 针对连接池可能使用到同个连接,因此需要重新将连接设置会自动提交,避免影响其他操作
                conn.setAutoCommit(true);
            }catch (Exception e){
                e.printStackTrace();
            }
            
            ConnectUtil.closeConnection(conn,null,null);
            System.out.println("资源关闭");
        }
    }

    public int update(Connection conn, String sql, Object... args){
        PreparedStatement ps = null;
        try{
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i+1,args[i]);
            }
            return ps.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            ConnectUtil.closeConnection(null,ps,null);
        }
        return 0;
    }
}

三、数据库的并发问题

package com.ruqi.prepareStatment;
import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;

public class DealShiWu {

    @Test
    public void updateTest(){
        Connection conn = null;
        try{
            conn = ConnectUtil.getConnection();
            conn.setAutoCommit(false);
            // 设置隔离级别,通常使用“读取已提交数据”的级别,避免读取脏数据
            conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
            conn.commit();
            System.out.println("事务处理成功");
        }catch (Exception exception){
            exception.printStackTrace();
            try{
                conn.rollback();
            }catch (Exception e){
                e.printStackTrace();
            }
        }finally {
            try {
                // 针对连接池可能使用到同个连接,因此需要重新将连接设置会自动提交,避免影响其他操作
                conn.setAutoCommit(true);
            }catch (Exception e){
                e.printStackTrace();
            }

            ConnectUtil.closeConnection(conn,null,null);
            System.out.println("资源关闭");
        }
    }

    public int update(Connection conn, String sql, Object... args){
        PreparedStatement ps = null;
        try{
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i+1,args[i]);
            }
            return ps.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            ConnectUtil.closeConnection(null,ps,null);
        }
        return 0;
    }
}

 2、隔离级别,越往下并发性越差,一致越好,通过取中间两种即可满足日常情况

 3、mysql设置隔离级别 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑*杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值