JDBC操作事务简单程序
事务:要么都成功,要么都不成功,它有ACID原则。
- 原子性:要么全部执行,要么都不执行。
- 一致性:总数不变。
- 隔离性:多个事务之间互不干扰。
- 持久性:一旦提交就不可逆。
还是先准备好数据库:
-- 选择数据库
USE `test02`;
-- 建表
CREATE TABLE `account` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`username` varchar(30) NOT NULL COMMENT '用户名',
`money` decimal(6,2) NOT NULL COMMENT '账户余额',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 插入数据
insert into `account`(`id`,`username`,`money`)
values (1,'xiaoming','1000.00'),
(2,'xiaohong','800.00');
我们就用Java程序来实现xiaoming给xiaohong转账的事务操作。
直接上Java代码:
封装的简单JDBCUtils类
package cn.ara;
import java.sql.*;
public class JDBCUtils {
private static String url = "jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf8&useSSL=true";
private static String username = "root";
private static String password = "rootroot";
//获取数据库连接对象
public static Connection getConnection(){
Connection connection = null;
try {
Class.forName("com.mysql.jdbc.Driver");
try {
connection = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return connection;
}
//释放资源
public static void close(Connection connection, Statement statement, ResultSet resultSet){
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
事务操作类:
package cn.ara;
import java.sql.*;
//简单JDBC程序操作事务
public class JdbcDemo02 {
public static void main(String[] args) {
//连接对象
Connection connection = null;
//执行预处理sql语句的对象
PreparedStatement preparedStatement = null;
try {
connection = JDBCUtils.getConnection();
//关闭自动提交 开启事务
connection.setAutoCommit(false);
//xiaoming账户扣除200
String sql1 = "update account set money = money - ? where username = ?";
preparedStatement = connection.prepareStatement(sql1);
preparedStatement.setInt(1,200);
preparedStatement.setString(2,"xiaoming");
preparedStatement.executeUpdate();
//错误
int a = 1/0;
//xiaohong账户扣除200
String sql2 = "update account set money = money + ? where username = ?";
preparedStatement = connection.prepareStatement(sql2);
preparedStatement.setInt(1,200);
preparedStatement.setString(2,"xiaohong");
preparedStatement.executeUpdate();
//业务结束,提交事务
connection.commit();
System.out.println("操作成功,已提交");
} catch (SQLException e) {
try {
//如果失败就回滚事务(这里的回滚可以不用显示定义,事务失败就会默认回滚)
connection.rollback();
System.out.println("操作失败,已回滚");
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}finally {
//释放资源
JDBCUtils.close(connection,preparedStatement,null);
}
}
}
我在程序中事务执行里面加了一条错误语句,就这样执行,事务是失败的,两个账户的余额都不会发生更改,事务在出错的时候,我们使用了try catch语句,错误就回滚,执行全部完成后再提交。当去除错误,我们发现就会转账成功,对应数据库表中也会发生变化。
以上就是Java操作事务的简单应用。