事务的特性
1.原子性(Atomicity):事务是应用中最小的执行单位,事务是应用中不可再分的最小逻辑执行体
2.一致性(Consistency):事务执行的结果,必须使数据库从一个一致性状态, 变到另一个一致性状态.当数据库只包含事务成功提交的结果时,数据库处于一致性状态
3.隔离性(Isolation):各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务都是隔离的.
4.持续性(Durability):持续性也称为持久性(Persistence)指事务一旦提交,对数据所做的任何改变都要记录到永久储存器中,通常就是保存进物理数据库.
public class TransactionDemo {
public static void main(String[] args) throws ClassNotFoundException {
// 第一步 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 第二步 获取数据库连接
// 连接字符串
String url = "jdbc:mysql://localhost:3306/demo_db_2021?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false";
// 用户名 密码
String userName = "root";
String password = "root";
Connection conn = null;
PreparedStatement ps = null;
try {
conn = DriverManager.getConnection(url, userName, password);
//事务第一步"开启事务" 关闭 jdbc 的自动提交
conn.setAutoCommit(false);
// 第三步 创建Statement
// prepareStatement 中使用?作为变量的占位符
String strSql = "UPDATE sys_user SET user_name=?,real_name=?,age=? WHERE id=?";
ps = conn.prepareStatement(strSql);
// 第四步 参数赋值
Date date = new Date();
ps.setString(1, "xjy");
ps.setString(2, "you修改");
ps.setInt(3, 21);
ps.setInt(4, 8);
// 第五步 执行sql
int rows = ps.executeUpdate();// 返回受影响的行数
if (rows == 1) {
System.out.println("第一次修改成功");
} else {
System.out.println("第一次修改失败");
}
int a=0;
int b=1/a;
strSql = "UPDATE sys_user SET user_name=?,real_name=?,age=? WHERE id=?";
ps = conn.prepareStatement(strSql);
// 第四步 参数赋值
ps.setString(1, "xjy");
ps.setString(2, "lajiyou事务");
ps.setInt(3, 21);
ps.setInt(4, 8);
// 第五步 执行sql
rows = ps.executeUpdate();// 返回受影响的行数
if (rows == 1) {
System.out.println("第二次修改成功");
} else {
System.out.println("第二次修改失败");
}
//事务执行完成后需要 手动提交
conn.commit();
} catch (SQLException e) {
if (conn!=null) {
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
// TODO: Auto-generated catch block
e.printStackTrace();
} finally {
if (conn != null) {
// 记住一定要关闭数据库连接
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
当事务中的代码运行报错时那么整个事务里的代码就不会执行成功.它只有整个事务里的代码全部运行成功才会改变数据.