“Java面试题冲刺第三十天--数据库(6)”这篇文章主要介绍了关于数据库中的事务控制及其实现方式等内容。下面是该文章的完整攻略:
事务控制
事务是指在数据库中执行的一个操作序列,这些操作要么全部执行成功,要么全部执行失败,不会出现执行了部分操作后停止的情况。事务控制是指保证事务的正确性和完整性,及其一致性的机制。
事务的ACID特性
-
原子性(Atomicity):事务是原子工作单位,事务中的所有操作要么全部成功,要么全部失败撤销,即具有 “原子性” 。
-
一致性(Consistency): 在事务开始和完成时,数据都必须保持一致状态,也就是说事务操作前后,数据库都必须处于一致性状态。
-
隔离性(Isolation):事务隔离性指的是一个事务在执行的时候,与其他事务是隔离的,执行中的事务数据不会被其他事务看到。
-
持久性(Durability):在事务成功完成之后,对数据的改变是持久的,即使发生系统崩溃也不会失去。
事务的实现方式
- 编程式事务管理:在代码中进行手动控制事务的提交或回滚操作。适合较小系统和少量数据的操作。
java
// 手动控制事务提交和回滚操作
try {
// 开始事务
conn.setAutoCommit(false);
// 执行SQL语句
// ...
// 提交事务
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
// 回滚事务
if (conn != null) {
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
} finally {
// 关闭连接
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 声明式事务管理:在配置文件中进行事务的管理,通过注解或XML文件标识事务边界以及默认事务属性等。适合较大系统和复杂事务处理。
```xml
```
示例演示
以 Spring Boot + MyBatis 实现对用户表的 CRUD 操作为例,演示事务的控制方式:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
// 编程式事务管理
@Override
public void addUser(User user) {
try {
// 开始事务
userMapper.addUser(user);
userMapper.addUserDetails(user);
// 提交事务
DataSourceUtils.getConnection(userMapper.getSqlSession().getConfiguration().getEnvironment().getDataSource()).commit();
DataSourceUtils.getConnection(userMapper.getSqlSession().getConfiguration().getEnvironment().getDataSource()).setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
// 回滚事务
if (DataSourceUtils.getConnection(userMapper.getSqlSession().getConfiguration().getEnvironment().getDataSource()) != null) {
try {
DataSourceUtils.getConnection(userMapper.getSqlSession().getConfiguration().getEnvironment().getDataSource()).rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
} finally {
// 关闭连接
if (DataSourceUtils.getConnection(userMapper.getSqlSession().getConfiguration().getEnvironment().getDataSource()) != null) {
try {
DataSourceUtils.getConnection(userMapper.getSqlSession().getConfiguration().getEnvironment().getDataSource()).close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
// 声明式事务管理
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
@Override
public void updateUser(User user) {
userMapper.updateUser(user);
userMapper.updateUserDetails(user);
}
}
在编程式事务管理中,通过获取数据库连接对象手动来控制事务的提交和回滚。在声明式事务管理中,通过@Transactional 注解和配置文件等方式, Spring 框架会自动完成事务的开启、提交 与回滚等操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java面试题冲刺第三十天–数据库(6) - Python技术站