概述
事物的定义:用于保证数据的完整性和一致性的事件
事物的四大特性:
ACID, 原子性(Atomicity), 一致性(Consistency), 隔离性(Isolation), 持久性(Durability)
原子性(Atomicity)
事务是一个原子操作,不可以拆分。事务的原子性确保动作要么全部完成,要么完全不起作用
一致性(Consistency
一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏
隔离性(Isolation)
可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
事物的实现方式:
1、编程式事物 2、声明式事物
声明式事物的实现方式
- 基于 TransactionProxyFactoryBean的声明式事务管理
- 基于 @Transactional 的声明式事务管理
- 基于Aspectj AOP声明式事务管理
下面我们主要了解编程式事物,基于 @Transactional 的声明式事务管理,基于Aspectj AOP声明式事务管理这三种事物管理
编程式事物的实现,原生jdbc
核心代码
//关闭自动提交
conn.setAutoCommit(false);
//提交事物
conn.commit();
//回滚事物
conn.rollback();
完整实例代码,可以实现500万数据在2分钟内插入数据库
/**
* 利用事物和批处理实现100完数据30秒内完成
*/
@org.junit.Test
public void Test(){
Connection conn = null;
PreparedStatement pstm =null;
long time1=System.currentTimeMillis();
try {
conn=getConnection();
String sql = "insert into info(username,sex,age) VALUES(?,?,?)";
pstm = (PreparedStatement) conn.prepareStatement(sql);
conn.setAutoCommit(false);
for (int i = 1; i <= 1000000; i++) {
String names[]={"张三","李四","Lily","露西","Jack","小明"};
int ss=(int) (Math.random()*6);
pstm.setString(1, names[ss]);
String sexs[]={"男","女"};
int kk=(int) (Math.random()*2);
pstm.setString(2, names[ss]);
pstm.setInt(3,(int) (Math.random()*100));
pstm.addBatch();
}
pstm.executeBatch();
conn.commit();
} catch (Exception e) {
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}finally{
conClose(conn, pstm, null);
}
long time2=System.currentTimeMillis();
System.out.println("插入数据库耗时"+(time2-time1)/1000);
}
/**
* 关闭数据库连接
* @param conn
* @param ps
* @param rs
*/
public void conClose(Connection conn,Statement ps,ResultSet rs){
try{
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
if(conn!=null){
conn.close();
}
}
}catch (SQLException e) {
System.out.println(e.getMessage());
}
}
/**
* 获取数据库连接
* @return
*/
public Connection getConnection(){
Connection conn =null;
try {
String url = "jdbc:mysql://localhost:3306/test2?characterEncoding=utf-8&useSSL=true&rewriteBatchedStatements=true";
String user = "liuhong";
String password = "liuhong987";
Class.forName("com.mysql.jdbc.Driver");
conn = (Connection) DriverManager.getConnection(url, user, password);
} catch (Exception e) {
System.out.println(e.getMessage());
}
return conn;
}
@Transactional 的声明式事务管理
@Transactional
public int batchInsert(){
List<Object[]> infoList=getInfoList();
long time1 = System.currentTimeMillis();
int result=infoDao.addBatchStudent(infoList);
long time2 = System.currentTimeMillis();
System.out.println("插入数据库耗时"+(time2-time1));
return result;
}
最后
以上就是飘逸钻石为你收集整理的浅谈Spring事物管理,实现百万数据插入MySQL数据库30秒内的全部内容,希望文章能够帮你解决浅谈Spring事物管理,实现百万数据插入MySQL数据库30秒内所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复