事务的概念
ACID四个原子性
Atomicity,原子性:一组事务,要么成功,要么失败
Consistency,一致性:事务执行前后,数据库状态保持一致
Isolation,隔离性:事务互相隔离
Durability,持久性:事务执行的结果是永久的
mysql开启事务
默认情况下,mysql每执行一条sql语句都是一条事务,自动提交。如果一条事务有多条sql语句需要执行,要开启一个新的事务
开启事务
start transaction
....
结束事务
commit/rollback
在执行SQL语句之前,先执行start transaction,这就开启了一个事务(事务的起点),然后可以去执行多条SQL语句,最后要结束事务,commit表示提交,即事务中的多条SQL语句所作出的影响会持久到数据库中,或者rollback,表示回滚到事务的起点,之前做的所有操作都被撤销了。
jdbc 开启事务
默认自动提交事务,若要手动提交,则关闭事务。
在JDBC中处理事务,都是通过Connection完成的。
同一事务中所有的操作,都在使用同一个Connection对象。
con.setAutoCommit(false) 表示开启事务。
...(进行多条sql)
commit():提交结束事务。
rollback():回滚结束事务。
附上jdbc代码练习
public static void main(String[] args) throws ClassNotFoundException {
Connection conn= null;
String driver = "com.mysql.jdbc.Driver";
//时区问题,serverTimezone=UTC
String url = "jdbc:mysql://localhost:3306/czt?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
String name = "root";
String password = "666666";
//先获取链接驱动
Class.forName(driver);
String sql =null;
try {
//通过driverManager获取链接
conn = DriverManager.getConnection(url, name, password);
if (conn != null ){
System.out.println("成功连接");
}
//通过链接,发送statement preperStatement的区别是,可以预编译sql语句,再注入参数,
Statement statement = conn.createStatement();
sql = "create table student(NO char(20),name varchar(20),primary key(NO))";
//返回影响行数
int i = statement.executeUpdate(sql);
if (i!=-1){
System.out.println("修改成功");
}
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
spring 开启事务
spring 事务管理详解
在xml配置文件中
第一步:配置事务管理器
第二步:开启事务注解
<!-- 第一步:配置事务管理器 (和配置文件方式一样)-->
<bean id="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入dataSource -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 第二步: 开启事务注解 -->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager" />
<!-- 第三步 在方法所在类上加注解 -->