欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库开发四:JDBC数据库开发进阶一(事务处理)

程序员文章站 2022-05-28 11:14:29
...

一、事务四大属性(ACID)
分别是原子性、一致性、隔离性、持久性.
1、原子性(Atomicity):事务中所有的操作是不再分割的原子单位.事务中的所有操作要么全部执行成功,要么全部执行失败.
2、一致性(Consistency):事务执行后,数据库状态与其他业务规则保持一致.如转账,无论事务执行成功与否,参与转账的2个账号余额之和应该是不变的
3、隔离性(Isolation):在并发操作中,不同事物之间应该隔离开来,使每个并发中的事务不会相互干扰
4、持久性(Durability):一旦事务提交成功,事务中所有的数据操作必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据

jdbc事务
在jdbc中处理事务,都是通过Connection完成的,同一事务中的所有操作,都在使用同一个Connection对象
1jdbc中的事务
Connection的三个方法与事务相关;
setAutoCommit(boolean);设置是否为自动提交事务,执行一条语句就提交,设置为false才能合理使用事务,因为操作往往是多个操作绑定在一起.
commit();提交结束事务
rollback();回滚结束事务
jdbc处理是事务的代码格式:
try{
    con.setAutoCommit(false);//开启事务
    con.commit();提交事务
}catch(){
    con.rollback();回滚事务
}

二、代码

数据库

CREATE TABLE `account` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `balance` decimal(12,0) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

 

package jdbc;
import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * jdbc完成事务处理
 * Created by kevin on 2020/3/25.
 */
public class Demo4 {
    public void zhuanzhang(String from,String to,double money){
        Connection connection = null;
        try {
            //Connection 同一事务中的所有操作,都在使用同一个Connection对象
            connection = JdbcUtils.getConnection();
            //开启事务
            connection.setAutoCommit(false);
            AccountDao accountDao = new AccountDao();
            accountDao.updateBalance(connection,from,-10000);
            if(true){
                throw new RuntimeException("失败了");
            }
            accountDao.updateBalance(connection,to,+10000);
            //提交事务
            connection.commit();
        } catch (Exception e) {
            e.printStackTrace();
            try {
                //回滚事务
                connection.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        } finally {
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Test
    public void fun1(){
        zhuanzhang("ls","zs",10000);
    }
}

 当抛出失败了的异常时,2个用户数据未出现变更和数据错乱,体现了事务的作用

package jdbc;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

/**
 * Created by kevin on 2020/3/24.
 */
public class JdbcUtils {
    private static Properties properties = null;
    static {
        try {
            InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbconfig.properties");
            properties = new Properties();
            properties.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnection() throws Exception{

        Class.forName(properties.getProperty("driverClassName"));
        return DriverManager.getConnection(properties.getProperty("url"),properties.getProperty("name"),properties.getProperty("password"));
    }


}

 

package jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
/**
 * Created by kevin on 2020/3/25.
 */
public class AccountDao {

    /**
     * 修改指定用户的余额
     * @param connection
     * @param name
     * @param balance
     */
    public void updateBalance(Connection connection,String name,double balance){
        try{

            String sql = "update account set balance=balance+? where name=?";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setDouble(1,balance);
            preparedStatement.setString(2,name);
            preparedStatement.executeUpdate();
        }catch (Exception e){

        }
    }
}

maven工程目录预览

数据库开发四:JDBC数据库开发进阶一(事务处理)

Demo4中存在的问题延伸
当前所有对Connection的操作都在Service层进行处理
需要把所有对Connection操作隐藏起来

 

相关标签: 数据库开发