Mysql事务操作失败如何解决

如题所述



Mysql事务操作失败如何解决

事务的原子性 :事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 。

要实现事务的原子性,单单靠一条commit或是rollback命令还是不行的,因为例如commit命令它只是将一个事务中执行成功的DML语句提交给数据库里。如果要实现事务的原子性,则就需要commit和rollback命令配合上程序上的一个业务逻辑才能可以,具体业务逻辑代码如下示例代码:

1.现象


程序中打开了事务进行插入,但是没有commit,表中的数据已经存在,就是回滚也不能删除插入的数据

2.原因


本表的Storage Engine 为myisam,不是innoDB,不支持事务处理 rollback()

3.解决方法


使用 alter table xxxx engine = innoDB ; 将表改为 InnoDB 引擎,结果回滚正常。

4.代码

private void testCrud() {
Connection conn = null; //连接对象
PreparedStatement pstmt = null; //预编译的SQL语句对象
try{
//加载MySQL驱动程序
Class.forName("com.mysql.jdbc.Driver");
//连接字符串
String url = "jdbc:mysql://localhost:3306/test";
//建立数据库连接
conn = DriverManager.getConnection(url,"root","");
//设置事务的隔离级别
// conn.setTransactionIsolation(Connection. TRANSACTION_REPEATABLE_READ);
//设置自动提交为false,开始事务
conn.setAutoCommit(false);
//带参数的更新语句
String sql = "INSERT INTO user_info (username ,password ,age )values(?,?,?)";
//准备语句
pstmt = conn.prepareStatement(sql);
//绑定参数,执行更新语句,将张三的账户金额减去1000元
pstmt.setString(1, "zhangui");
pstmt.setString(2, "1111");
pstmt.setInt(3, 300);
pstmt.execute();

//绑定参数,执行更新语句,将李四的账户金额增加1000元
// pstmt.setString(1, "zzzzzzzzzzzzzzzzz"); //绑定了非法参数
//pstmt.setString(2, "1111111111");
//pstmt.setInt(3, 500);
//pstmt.execute(); //将抛出SQL异常
//提交事务
//conn.commit();
System.out.println("事务已提交,转账成功!");
//关闭语句、连接
pstmt.close(); conn.close();
}catch(Exception e){
try{
conn.rollback(); //回滚事务
System.out.println("事务回滚成功,没有任何记录被更新!");
}catch(Exception re){
System.out.println("回滚事务失败!");
}
e.printStackTrace();
}finally{
if(pstmt!=null) try{pstmt.close();}catch(Exception ignore){}
if(conn!=null) try{conn.close();}catch(Exception ignore){}
}

}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!




您可能感兴趣的文章:Mysql事务处理详解通过实例分析MySQL中的四种事务隔离级别解决Mysql收缩事务日志和日志文件过大无法收缩问题mysql的存储过程、游标 、事务实例详解PHP mysqli事务操作常用方法分析MySQL四种事务隔离级别详解NodeJs使用Mysql模块实现事务处理实例MySQL数据库事务隔离级别详解MySQL事务的基础学习以及心得分享


温馨提示:内容为网友见解,仅供参考
无其他回答

Mysql事务操作失败如何解决
Mysql事务操作失败如何解决事务的原子性 :事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 。要实现事务的原子性,单单靠一条commit或是rollback命令还是不行的,因为例如commit命令它只是将一个事务中执行成功的DML语句提交给数据库里。如果要实现事务的原子性,则就需要commit和rol...

MySQL中XA事务发生异常的解决方法mysqlxa异常
当XA事务发生异常时,可以使用XA RECOVER命令来恢复事务。这个命令会返回一个事务ID列表,这些事务ID表示已经在进行但尚未提交的XA事务。可以通过以下命令来执行XA RECOVER操作:xa recover;执行该命令后,会返回所有尚未完成的XA事务ID。4.手动提交和回滚 当XA事务发生异常时,可以手动提交或回滚事务。这种...

MySQL异常频繁数据操作受阻mysql一直出错
a.优化事务处理机制:通过合理利用事务处理机制,尽量减少事务处理时间和冲突概率。b.加强线程间的交互与协作:通过线程间的交互与协作,建立良好的资源锁定和释放机制,缓解死锁问题。c.设置超时机制:在不能直接解决死锁的情况下,可以设置超时机制,使死锁自动释放,减少死锁的影响。三、结论 MySQL异常频繁...

学会MySQL回滚轻松恢复数据误操作问题mysql如何回滚
MySQL回滚可以使用如下两种方法:1.使用ROLLBACK语句回滚 ROLLBACK语句可以撤销当前事务所做的任何修改,并将数据库恢复到事务开始前的状态。例如,假设你正在进行一个长期的数据库操作,期间你意外地清空了一个重要的表。如果你发现错误并且还没有提交事务,那么你可以使用ROLLBACK语句回滚数据,并将它们恢复...

解决MySQL中常见的Error问题mysql中error
这种错误通常表明MySQL服务器无法在所需端口上运行。我们可以使用以下命令来解决此问题:sudo service mysql start 这样可以启动MySQL服务器,并确保它在所需端口上运行。4. Error 1205: Lock wt timeout exceeded 这个错误通常出现在多个用户同时访问同一数据行时。它可能是由于长时间的事务或未正确释放的...

MySQL事务回滚问题简介MySQL中不能回滚事务
在上面的代码中,我们使用START TRANSACTION语句开启一个事务,并尝试执行三个SQL INSERT命令。如果第三个命令出现错误,则TRY块会引发一个异常,执行附带的ROLLBACK语句以回滚事务。在这种情况下,我们不会向数据库中插入任何数据,并输出适当的错误消息,说明数据库操作失败。结论 MySQL是一种功能强大的开源...

MySQL数据库遭遇两个冲突问题如何解决mysql下了两个冲突
解决方法:1. 优化查询语句。在使用事务时,应尽量避免对大量数据进行操作,避免出现不必要的死锁现象。2. 设计合理的索引。使用索引可以提高查询效率,从而降低发生死锁的可能。3. 调节InnoDB的参数。可以调节InnoDB的参数以达到优化的效果,比如将innodb_lock_wt_timeout设置成一个较大的值以减少死锁的...

MySQL中Undo事务回滚的关键机制mysql中undo
MySQL中Undo的实现方式主要是通过两个机制:Write Ahead Logging(WAL)和两段式提交。WAL机制是指在执行一次事务操作之前,先将这次操作的所有影响写到一个日志文件中(称为redo log)。而在执行事务操作的时候,先写入Undo日志、然后写入修改的数据页。如果这次操作失败的话,只需按照写入Undo日志的顺序,...

如何解决Mysql无法自动提交的问题mysql不能自动提交
如果你无法解决MySQL自动提交的问题,可以考虑禁用自动提交,并使用事务控制语句手动提交事务。例如,你可以在执行SQL语句前使用以下语句禁用自动提交:SET autocommit=0;在执行所有SQL语句后,你可以使用以下语句提交事务:COMMIT;结论 在MySQL中,自动提交是默认的事务模式,但有时候它可能会失败。本文讨论了...

MySQL误操作怎么办不可恢复的操作怎么防止mysql不可恢复的操作
MySQL误操作的解决方法 误操作是指当我们在使用MySQL时,由于疏忽或者其他原因,不小心对数据库进行了一些错误的操作,导致数据被删除或损坏。对于这种情况,我们可以使用以下方法进行修复:1. MySQL日志的使用 MySQL提供了多种日志记录功能,包括二进制日志、错误日志、慢查询日志等。这些日志可以记录MySQL在...

相似回答
大家正在搜