数据库开发四:JDBC数据库开发进阶一(事务处理)
一、事务四大属性(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工程目录预览
Demo4中存在的问题延伸
当前所有对Connection的操作都在Service层进行处理
需要把所有对Connection操作隐藏起来
推荐阅读
-
mysql 开发进阶篇系列 26 数据库RPM安装演示
-
mysql 开发进阶篇系列 26 数据库RPM安装演示
-
Java开发笔记(一百四十七)通过JDBC管理数据库
-
mysql 开发进阶篇系列30 数据库二进制包(安装指定路径,目录介绍)
-
mysql 开发进阶篇系列 25 数据库RPM安装目录介绍
-
android开发中如何使用jdbc连接数据库
-
我的第一个python web开发框架(34)——权限数据库结构设计
-
mysql 开发进阶篇系列 29 数据库二进制包安装
-
Oracle 9i & 10g编程艺术-深入数据库体系结构——第一章 开发成功的Oracle应用程序(转)
-
Oracle 9i & 10g编程艺术-深入数据库体系结构——第一章 开发成功的Oracle应用程序(转)