数据库事务是一组数据库操作,它们被视为一个单一的逻辑工作单元,要么全部成功执行,要么全部回滚(撤销)到事务开始前的状态。事务是确保数据库数据一致性、完整性和可靠性的关键机制之一。
简单来说,事务就是把好几个sql语句集合在一起。假如有一个事务,事务里有sql语句abc,当我们执行完语句a后,真正的数据库不会发生改变,但在mysql命令行里,你可以看到一个临时的表格,显示如果这条语句真的生效后,会发生什么。此时如果你选择rollback(回滚),就会撤销这条临时的sql指令a。
此时如果你继续执行bc语句,点击提交,这时真正的数据库才发生了改变。(只执行了bc的内容,a的被回滚了)
事务具有以下四个关键属性,通常称为 ACID 特性:
原子性(Atomicity): 事务是原子的,即要么全部执行成功,要么全部回滚,没有中间状态。如果在事务执行期间发生错误,所有对数据库的更改将被撤销。
一致性(Consistency): 事务将数据库从一种一致状态转移到另一种一致状态。在事务开始前和结束后,数据库必须保持一致性。
隔离性(Isolation): 多个事务可以并发执行,但每个事务看起来就像是在独立执行一样,不会相互影响。隔离性确保并发事务的执行不会导致不一致的数据库状态。
持久性(Durability): 一旦事务成功提交,其对数据库的更改应该是永久性的,即使在系统故障或重启后仍然有效。持久性确保事务的提交是可靠的。
数据库事务通常使用以下关键命令来定义:
在数据库中,事务的应用可以确保在复杂的数据操作中维护数据的一致性,并防止数据损坏。例如,银行转账是一个事务,如果其中一个账户的扣款成功而另一个账户的存款失败,整个事务将被回滚,以确保数据一致性。
JDBC默认的事务处理行为是自动提交,所以前面我们执行一个SQL语句就会被直接提交(相当于没有启动事务),所以JDBC需要进行事务管理时,首先要通过Connection对象调用setAutoCommit(false) 方法,关闭自动提交。
connection.setSavepoint();可以设置回滚点。
connection.rollback(savepoint);可以进行回滚
connection.commit();提交
package jdbc;
import java.sql.*;
public class Transaction {
public static void main(String args[]){
try(Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306","root","020809");
Statement statement=connection.createStatement()){
connection.setAutoCommit(false);
statement.executeUpdate("INSERT INTO accounting_ledger.user VALUES ('lyx', '12345');");
//设置回滚点
Savepoint savepoint=connection.setSavepoint();
statement.executeUpdate("INSERT INTO accounting_ledger.user VALUES ('lyx1', '12345');");
statement.executeUpdate("INSERT INTO accounting_ledger.user VALUES ('lyx2', '12345');");
//将会回滚到第一条sql语句执行后
connection.rollback(savepoint);
//提交事务,只会执行第一条sql语句
connection.commit();
}catch (SQLException e){
e.printStackTrace();
}
}
}