1.一组数据命令要么都执行,要么都不执行 (同生共死)。
2.事务的四大属性: 原子性(atomicity)、一致性(consistercy)、隔离性(isolation)及持久性(durability)
3.用T-SQL语句执行事务;
BEGIN TRANSACTION ----------开始事务
COMMIT TRANSACTION -----------提交事务
ROLLBACK TRANSACTION --------------回滚事务
4.事务分类:
a.显示事务:用begin transaction 明确指定事务的开始
b.隐式事务:通过设置 set implicit_transactions on语句,将隐式事务模式打开。
c.自动提交事务:这是SQL Server的默认模式,它将每条单独的T_SQL语句视为一个事务。
4.事务应用实例:银行转账
java代码链接如下:
package com.xing.data; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.Scanner; public class Shiwu { public static void main(String[] args) { System.out.println("请输入转账金额:"); Scanner sc = new Scanner(System.in); int inp = sc.nextInt(); try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("加载驱动不成功"); } Connection con = null; Statement st = null; try { con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/bank", "root", "root"); st = con.createStatement(); st.execute("begin;"); int a = 0; String sql1 = "UPDATE alls SET money=money-'" + inp + "' where name='小名'"; // 当这里转账超出时直接进入异常处理,处理回滚 String sql2 = "UPDATE alls SET money=money+'" + inp + "' where name='小哈'"; a += st.executeUpdate(sql1); a += st.executeUpdate(sql2); if (a == 2) { st.execute("commit;"); System.out.println("转账成功"); } } catch (Exception e) { // 异常中处理回滚 // TODO Auto-generated catch block try { st.execute("rollback;"); System.out.println("转账超额,不能转"); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } finally { try { st.close(); con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }