Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DriverManager.getConnection(XXX,XXX,XXX);
conn.setAutoCommit(false);
pstmt = conn.prepareStatement("INSERT INTO XXXX");//执行插入操作 1
pstmt.addBatch();
//省略中间代码
pstmt.addBatch(sql1);//执行修改操作 2
pstmt.addBatch(sql2);//执行修改操作
pstmt.addBatch(sql3);//执行修改操作
pstmt.executeBatch();
conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
if (conn != null){
conn.rollback();//此处被调用 3
}
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
if(pstmt != null)
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
pstmt = null;
}
if(conn != null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
conn = null;
}
}
标记2出错,标记1插入的数据仍然进入数据库,调试跟踪发现标记3处代码被执行并且没有异常,执行了回滚操作,但是为什么数据还是被插入数据库了,求教?
PreparedStatement pstmt = null;
try {
conn = DriverManager.getConnection(XXX,XXX,XXX);
conn.setAutoCommit(false);
pstmt = conn.prepareStatement("INSERT INTO XXXX");//执行插入操作 1
pstmt.addBatch();
//省略中间代码
pstmt.addBatch(sql1);//执行修改操作 2
pstmt.addBatch(sql2);//执行修改操作
pstmt.addBatch(sql3);//执行修改操作
pstmt.executeBatch();
conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
if (conn != null){
conn.rollback();//此处被调用 3
}
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
if(pstmt != null)
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
pstmt = null;
}
if(conn != null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
conn = null;
}
}
标记2出错,标记1插入的数据仍然进入数据库,调试跟踪发现标记3处代码被执行并且没有异常,执行了回滚操作,但是为什么数据还是被插入数据库了,求教?
mysql> set autocommit=0;
select * from test;
insert into test values (1,'a');
select * from test;
commit;
select * from test;
set autocommit=0;
insert into test values(2,'b');
select * from test;
rollback;
select * from test;Query OK, 0 rows affectedEmpty setQuery OK, 1 row affected+----+------+
| id | name |
+----+------+
| 1 | a |
+----+------+
1 row in setQuery OK, 0 rows affected+----+------+
| id | name |
+----+------+
| 1 | a |
+----+------+
1 row in setQuery OK, 0 rows affectedQuery OK, 1 row affected+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
+----+------+
2 rows in setQuery OK, 0 rows affected+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
+----+------+
2 rows in set这是我测试的,貌似确实是不支持事务
看看有没有have_innodb
确定你的表type是InnoDB?
MySQL中只有InnoDB和BDB支持事务哎,mysql这种免费的东西...好久好久没用了,的确各方面都达不到我的要求诶
现在要么商业应用就用用MSSQL,简单应用就上SQLITE了,这东西还不错
mysql> set autocommit=0;select * from test;insert into test values(3,'c');select * from test;rollback;select * from test;
Query OK, 0 rows affected+----+------+
| id | name |
+----+------+
| 1 | a |
+----+------+
1 row in setQuery OK, 1 row affected+----+------+
| id | name |
+----+------+
| 1 | a |
| 3 | c |
+----+------+
2 rows in setQuery OK, 0 rows affected+----+------+
| id | name |
+----+------+
| 1 | a |
+----+------+
1 row in set
但是我的代码里边事务还没没能回滚,感觉代码也没什么问题啊