事务提交过程,出现异常,但是回滚事务失败,这是什么原因

/**
*实现事务:Tom 对Jerry 转账500元
*
*/
public class TransactionTest {

public static void update(Connection conn,String sql,Object ... args){
    PreparedStatement pstmt = null;
    try{
        pstmt = conn.prepareStatement(sql);//通过SQL语句 创建PreparedStatement 对象。

        //利用 for 循环对 SQL 语句中的 PreparedStatement 占位符 ,更新数据。
        for(int i = 0;i < args.length;i++){
            pstmt.setObject((i+1), args[i]);
        }
        //更新执行。
        pstmt.executeUpdate();

    }catch(Exception e){
        e.printStackTrace();
    }finally{
        //关闭数据库连接。
        JDBCTools.release(null, pstmt, null);
    }
}

public static void main(String[] args) {
    Connection conn = null;

    try{
        conn = JDBCTools.getConnection();

        //取消默认的提交方式
        conn.setAutoCommit(false);

        String sql = "UPDATE user SET balance = balance - 500 WHERE id = 2000001";
        update(conn, sql);

/*此处会 报com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException,Table 'ming.users' doesn't exist
但是,整个事务却没有回滚。*/

        sql = "UPDATE users SET balance = balance + 500 WHERE id = 2000002";
        update(conn,sql);

        //若事务操作正常,则提交事务
        conn.commit();

    } catch(Exception e){
        //若事务操作出现异常,则需要在异常处理中回滚事务
        try {
            conn.rollback();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
        e.printStackTrace();
    } finally{
        JDBCTools.release(null, null, conn);
    }
}

}

weixin_42728761
weixin_42728761 可能是mysql引擎的问题,你到navicat里面,右键数据表选择“设计表”,选择“选项”,将 “引擎”这一项改为“InnoDB”。如果是mysql引擎的原因,这样设置就可以了。
一年多之前 回复

6个回答

我刚才写了一些代码,自己建了一个数据库表usertable,字段为id,name,进行了测试。
我先在你的代码中加入一些文字说明。好看出代码运行的地方。
图片说明
图片说明
更新成功的结果如下:
图片说明
更新失败的结果如下(当然,我是故意设置和你一样异常的结果,即找不到该数据库表):
图片说明
结果表明,无论成功或是失败,都执行了提交操作。
后来我将你的update方法注释掉,并将其具体代码放在了main方法中,如下图。
图片说明
结果就成功了。
图片说明
我猜想是你的update方法已经对该方法可能出现的异常做出了异常处理,所以对于Main函数的try就无法捕获异常,所以就认为是没有问题的,就一直这么执行下去了。
这个我也是想了挺久的,不知道有没有想对,但愿对你有帮助。

sleeping_xixi
奔跑的小猪 不客气。共同进步。
3 年多之前 回复
ming_2017
ming_2017 谢谢你了,应该是这个问题了,
3 年多之前 回复

图片说明

报的语法错误,(user表能创建?)users表不存在,批量处理用addbatch()吧?这样才体现整体性

ming_2017
ming_2017 mysql中能创建的,users 我最初拼写错误,出了异常,但是事务提交了,没得到回滚。现在知道问题出在哪里了,谢谢你了
3 年多之前 回复

可能第二个sql语句中表users不存在,没法回滚!

ming_2017
ming_2017 刚开始是拼写错误,但是后来想不对,出异常怎么事务还能提交,然后就发这个错误拼写的帖子,想找原因,现在找到了,谢谢你了
3 年多之前 回复

如果对你有帮助,就回复我一声呗。我刚在这里回答问题不久,基本回答了就没有回应,所以不知道这样做有没有用。

ming_2017
ming_2017 回复奔跑的小猪: 嗯,我也是,弄明白,感觉理解也深一层了
3 年多之前 回复
sleeping_xixi
奔跑的小猪 其实为了想清楚这个问题,我花了三小时。那天早上睡醒看到了,也觉得好奇就试一试,结果弄到了接近中午。不过还是挺开心,也算把一个问题弄明白了。
3 年多之前 回复
ming_2017
ming_2017 想明白了,执行过程中,已经对异常进行了处理,在main方法中没有新的异常抛出来,自然不会被catch语句块捕获异常,自己居然就没有事务回滚了。
3 年多之前 回复
ming_2017
ming_2017 我截图出来了,就是这个原因,谢谢你了
3 年多之前 回复
ming_2017
ming_2017 我也很少看论坛,就是这个问题想了很久,没想明白,才尝试下发论坛找下答案
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
spring事务 insert成功之后出现异常不回滚

``` @Transactional(rollbackFor=RuntimeException.class, propagation = Propagation.REQUIRED,isolation= Isolation.READ_UNCOMMITTED) ``` 声明式配置 ``` 前面一个insert操作 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //手动开启事务回滚 throw new RuntimeException(); ``` insert未回滚 这两行没用在service层还是出现了脏数据

spring事务传播异常,事务回滚异常

@Transactional(value="tx2",propagation=Propagation.REQUIRED)//也可以修改为REQUIRED @RequestMapping(value="/TranClass_never",method=RequestMethod.GET) @ResponseBody public void dba_test_never(){ for(int i=0;i<5;i++){ peod.insertPeo(i); } try{ del_never(3); }catch(Exception e){ e.printStackTrace(); } String qq=null; qq.equals(""); } @Transactional(value="tx2",propagation=Propagation.NEVER ) public void del_never(int i){ peod.insertPeo(100); String qq=null; qq.equals(""); peod.delPeo(i); peod.delPeo(i+1); } del_never方法的事务声明为NEVER,系统没有报NEVER的异常;将此方法事务声明为REQUIRES_NEW时,外层事务发生回滚时里面的事务也发生回滚(这两事务应该互不影响的,为什么会发生这种错误?);将此方法事务声明为NESTED时,且将dba_test_never方法中空指针异常的语句清除后,为什么del_never方法无法进行事务回滚?

rocketmq消息事务,已提交事务如何回滚?

rocketmq的事务, 假如银行转账操作,银行A和银行B要执行分布式事务 ,银行A执行账户减钱操作成功了,半消息commint,银行B获取到消息后执行DB操作给账户加钱,失败了的话,银行A如何回滚呢?

sqlite 事务提交或者回滚之后,数据库是否仍被占用

今天在做对一个功能进行优化,其目的在于在往数据库存储信息之前,备份一个数据库,然后正常开启事务,插入信息,如果出现任何异常,则事务回滚,同时删除现有数据库,将备份数据库还原到原来的位置,但是在事务回滚之后尝试删除现有数据库时发现异常,现有数据库被别的进程占用,但目前已确定除了事务数据库没有别的链接了,请问事务提交或者回滚之后,如何释放占用?

spring 事务管理 手动回滚策略

如果我不用spring的事务代理机制,直接在service代码中进行事务的提交或者回滚处理,那么一般是这样的处理逻辑-->主要有2点: 即 1:事务流程中,某一节点的数据(正常返回)遇到某值时,进行回滚,执行结果中说明情况. 2:事务流程中,try catch 所有的代码-->保证遇到运行时异常,或者error的时候,进行回滚 现在要用spring的事务管理了,导致在处理提到的第一个情况的时候有个问题,不知道如何解决 就是spring所管理到的业务代码方法,必须要抛出指定异常,才可以回滚 那么,如果我在1中的那种情况,如何保证让service方法,既有返回值,又能回滚呢?

java连接mysql的时候,事务没有提交遇到错误的时候还需要回滚吗?

preparedStatement.executeUpdate(); // int i = 2 / 0; preparedStatement = connection.prepareStatement(sql2); preparedStatement.executeUpdate(); connection.commit(); java进行mysql操作的时候,事务没有提交之前遇到错误的时候还需要回滚吗?

jta事务异常回滚时报错

在进行频繁更新数据库后出现如下错误: ![图片说明](https://img-ask.csdn.net/upload/201612/26/1482732197_497827.png) 事务配置如下: <tx:method name="update*" propagation="REQUIRES_NEW" rollback-for="Exception"/> <tx:method name="sel*" propagation="REQUIRES_NEW" rollback-for="Exception"/> 请问各位大神这是什么原因 紧急

关于spring嵌套事务中的回滚问题

现在项目中要配置嵌套事务,一个service要调用其他service(大约8个)中的方法来完成,要调用的service已经配置的事务,不能修改,现在我想让这调用的8个service的其中一个失败后其他全部都回滚,该怎么配置,框架是ssh,数据库是mysql5.0

spring springmvc 和mongodb 整合时,关于事务的回滚,在配置文件里是怎么配置?

spring springmvc 和mongodb 整合时,关于事务的回滚,在配置文件里是怎么配置?

Spring事务service中,如果处理了dao层的异常,事务还能否回滚?

dao层方法在service层中执行出现了异常,并且我手动在service层接收并处理了异常, 这时AOP绑定在service层的事务还能不能回滚了?

事务居然有回滚,那么为什么会出现数据库的表一直无法写入的情况

a和b两个事务发生资源冲突,其中一个事务回滚,另一个是继续执行下去,但是为什么还会发生锁表一直无法写入的情况

c#.net 调用oracle存储过程,不能正常回滚

本人是个小菜,刚接触.net不久,使用事务不熟练,导致回滚失败。下面是代码: enter code here using (OracleConnection conn = new OracleConnection(strConn)) { if (conn.State != ConnectionState.Open) { conn.Open(); } OracleCommand cmd = conn.CreateCommand(); OracleTransaction ot = conn.BeginTransaction(IsolationLevel.ReadCommitted); cmd.Connection = conn; cmd.Transaction = ot; //cmd.Transaction = ot; //OracleTransaction ot = conn.BeginTransaction(); try { foreach (XmlNode node in itemNodes) { rcptGroupId = Convert.ToString(node.SelectSingleNode("RcptGroupID").InnerText); amt = node.SelectSingleNode("Price").InnerText; OracleParameter[] pm = new OracleParameter[14]; pm[0] = new OracleParameter("cardno", OracleType.VarChar, 20); pm[0].Direction = ParameterDirection.Input; pm[0].Value = cardNo; pm[1] = new OracleParameter("rcptgroupid", OracleType.VarChar, 100); pm[1].Direction = ParameterDirection.Input; pm[1].Value = rcptGroupId; pm[2] = new OracleParameter("amt", OracleType.Number); pm[2].Direction = ParameterDirection.Input; pm[2].Value = float.Parse(amt); pm[3] = new OracleParameter("secrityno", OracleType.VarChar, 32); pm[3].Direction = ParameterDirection.Input; pm[3].Value = secrityNo; pm[4] = new OracleParameter("cardserno", OracleType.VarChar, 32); pm[4].Direction = ParameterDirection.Input; pm[4].Value = cardSerNo; pm[5] = new OracleParameter("userid", OracleType.VarChar, 4); pm[5].Direction = ParameterDirection.Input; pm[5].Value = userID; pm[6] = new OracleParameter("rcptno", OracleType.VarChar, 20); pm[6].Direction = ParameterDirection.Output; pm[7] = new OracleParameter("resultcode", OracleType.Int16); pm[7].Direction = ParameterDirection.Output; pm[8] = new OracleParameter("errormsg", OracleType.VarChar, 200); pm[8].Direction = ParameterDirection.Output; //add 2013.8.1 pm[9] = new OracleParameter("Bank", OracleType.VarChar, 20); pm[9].Direction = ParameterDirection.Input; pm[9].Value = bank; pm[10] = new OracleParameter("BankNo", OracleType.VarChar, 20); pm[10].Direction = ParameterDirection.Input; pm[10].Value = bankno; pm[11] = new OracleParameter("TransMoney", OracleType.VarChar, 10); pm[11].Direction = ParameterDirection.Input; pm[11].Value = decimal.Parse(TransMoney); pm[12] = new OracleParameter("CashTraceNo", OracleType.VarChar, 30); pm[12].Direction = ParameterDirection.Input; pm[12].Value = CashTraceNo; pm[13] = new OracleParameter("TerminalId", OracleType.VarChar, 16); pm[13].Direction = ParameterDirection.Input; pm[13].Value = TerminalId; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "pkg_autobillservice.proc_autoopbillcharge2"; cmd.Parameters.AddRange(pm); cmd.ExecuteNonQuery(); rcptNoList.Add(Convert.ToString(pm[6].Value)); } ot.Commit(); } catch (Exception ex) { ot.Rollback(); return string.Format(result, "1", ex.Message, "", rcptGroupId); } finally { cmd.Dispose(); ot.Dispose(); } } 调用存储过程,第一次错误了能回滚,再执行一次到cmd.ExecuteNonQuery()数据就已经提交了。 这样写在循环第二次的时候还会报错,错误为:System.Data.OracleClient.OracleExceptionMessage=ORA-06550: 第 1 行, 第 7 列: PLS-00703: 列表中具有指定参数的多个实例。 一天了还是没有法解决,求大家帮忙看下。

Springboot2.x + JPA,因嵌套事务导致的子方法事务不能回滚的问题?

模拟项目的业务场景:ServiceA 中,有方法mA1()、mA2(),ServiceB 中,有方法mB3(),调用如下: ``` public void mA1() { ... // business code mA2(); mB3(); // 这段代码是模拟抛出异常,本还有其他 method int i = 0; if (i == 0) throw new CustomExeption(); // 抛出自定义运行时异常 } ``` 所要实现的是:如果抛出异常,这三个方法的事务都需要回滚。但也就蛋疼在这,无论怎么配置,都无法实现: 1. 最开始,三个方法事务的配置都是@Transactional 2. 在网上查找后(参考: https://www.ibm.com/developerworks/cn/java/j-master-spring-transactional-use/index.html 、 https://blog.csdn.net/w605283073/article/details/93674200 、 https://blog.csdn.net/ncuzengxiebo/article/details/82710859 ),然后尝试这么配置: ``` @Transactional(propagation = Propagation.REQUIRES_NEW) public void mA1() {...} @Transactional(propagation = Propagation.NESTED) public void mA2() {...} @Transactional(propagation = Propagation.NESTED) public void mB3() {...} ``` 但是依然无法实现回滚子方法事务; 3. 继续在网上查找(参考: https://www.iteye.com/topic/35907 、 https://blog.csdn.net/weixin_41678899/article/details/80196620 ),说是 _nestedTransactionAllowed_ 默认为 _false_,要手动开启嵌套事务才行,翻看源码,发现确实是哦(其实并不是...) ![图片说明](https://img-ask.csdn.net/upload/201909/09/1568032940_498505.png) ![图片说明](https://img-ask.csdn.net/upload/201909/09/1568032973_30711.png) 然后我是这样配置的: ![图片说明](https://img-ask.csdn.net/upload/201909/09/1568033006_963985.png) 运行之后测试,发现依然不能回滚子方法的嵌套事务; 4. 于是测试了一下,发现 springboot2.x 应该是 _nestedTransactionAllowed_ 默认就为 true,于是,如图: ![图片说明](https://img-ask.csdn.net/upload/201909/09/1568033175_538353.png) 证实了我的猜想。 但我真的太郁闷了,网上的方法都用了,但是配置了之后都无效(已经一天了...比较菜),希望能有大佬解答一下我的困惑和问题,谢谢了。 最后,贴一小段项目源码: ![图片说明](https://img-ask.csdn.net/upload/201909/09/1568033365_781329.png)

Java事物回滚失效,在抛出异常的情况下仍然提交了SQL

private Connection connection; private Statement pre; public String set(String goal,String marriage){ return "update info set goal='"+goal+"'where marriage='"+marriage+"'"; } public void start(){ String sql="jdbc:mysql://127.0.0.1/student"; try { connection = DriverManager.getConnection(sql,"root","111"); connection.setAutoCommit(false); pre = connection.createStatement(); pre.executeUpdate(set("配偶","未婚")); pre.executeUpdate(set("情人","已婚")); pre.executeUpdate(set("包养","学生")); if(true) throw new SQLException("ni"); connection.commit(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); try { connection.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }

如果数据库不支持事务,如何保证sql执行中出错回滚

如果数据库不支持事务,也不能改为支持事务的存储引擎,如何解决sql执行中出错进行回滚。

Java在触发事务回滚之后为什么会再一次回到Servlet开始的地方重新走一次流程?

## 代码流程 1. 前台点击"提交订单"进入`BaseServlet.class` 2. `BaseServlet.class`分发至子类`OrderServlet.class`的`submitOrder()`方法 3. `submitOrder()`调用Service层的`submitOrder()`方法. 4. 关键是Service层`submitOrder()`中使用了事务回滚. 这里调用了`Dao`层两个方法: `fun01()`和`fun02()`, 其中`fun01`执行成功, `fun02()`执行时抛出异常. 5. catch到异常后, 执行回滚. 然后关闭连接. 然后, **异常诡异的是, 程序并没有在回滚、关闭连接后结束,而是再一次进入`BaseServlet`。** 再一次执行一次上述流程,而这一次,由于第一次已经将*线程绑定的连接*关闭了。所以自然出现异常:不能操作已经关闭的连接。 **我的疑惑是:为什么它走了两次这个流程?是因为我调用了个`dao`层的插入数据的方法吗?** 还是或事物回滚就是从头在执行要一遍流程呢? 这个异常, 导致回滚技术无法实现呀. ## 代码片段(图片) ![图片说明](https://img-ask.csdn.net/upload/201711/12/1510464901_837407.png) ## 代码片段源码 ### Servlet层 ``` public String submitOrder(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ... Debug.log("进入方法:submitOrder..."); // 打印信息 boolean flag = false; // 调用service层方法 flag = orderService.submitOrder( pids, checkeds, quantitys, user ); // 提交成功 --> order_info.jsp页面 失败 --> info.jsp if( flag ) { return goOrderInfoUI(req, resp); }else { req.setAttribute("error", "提交订单失败!"); return "/info.jsp"; } } ``` ### service层 ``` ... // 获得*线程绑定的连接* Connection conn = null; try { conn = C3P0Util.getConnection(); Debug.log("连接=="+conn); // 开启事务 // 由于插入要么都成功, 要么都失败, 所以需要用事务操作 Debug.log("进入try"); conn.setAutoCommit(false); Debug.log("开启事务"); // 调用dao插入数据库 // 插入订单 orderDao.insertOrder(order); Debug.log("order插入走完"); // 插入订单项 orderDao.insertOrderItmes( orderItems ); // 提交事务 conn.commit(); // 方法返回值为true Debug.log("事务已提交"); flag = true; }catch(Exception e) { Debug.log("进入外层catch"); // 回滚事务 try { conn.rollback(); Debug.log("事务已回滚"); } catch (SQLException e1) { // TODO Auto-generated catch block Debug.log("进入内存catch"); e1.printStackTrace(); } }finally { // 关闭连接 try { Debug.log("关闭连接"); conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Debug.log("service走完"); return flag; ... ``` 注:*`Debug.log()`是自定义方法用来打印信息.*

在事务中途提交工作,然后继续执行的一种简单方法是

<div class="post-text" itemprop="text"> <h2>Background</h2> <p>I am using the <code>github.com/jmoiron/sqlx</code> golang package with a Postgres database. </p> <p>I have the following wrapper function to run SQL code in a transaction:</p> <pre><code>func (s *postgresStore) runInTransaction(ctx context.Context, fn func(*sqlx.Tx) error) error { tx, err := s.db.Beginx() if err != nil { return err } defer func() { if err != nil { tx.Rollback() return } err = tx.Commit() }() err = fn(tx) return err } </code></pre> <p>Given this, consider the following code:</p> <pre><code>func (s *store) SampleFunc(ctx context.Context) error { err := s.runInTransaction(ctx,func(tx *sqlx.Tx) error { // Point A: Do some database work if err := tx.Commit(); err != nil { return err } // Point B: Do some more database work, which may return an error }) } </code></pre> <h2>Desired behavior</h2> <ul> <li>If there is an error at Point A, then the transaction should have done zero work</li> <li>If there is an error at Point B, then the transaction should still have completed the work at Point A.</li> </ul> <h2>Problem with current code</h2> <p>The code does not work as intended at the moment, because I am committing the transaction twice (once in <code>runInTransaction</code>, once in <code>SampleFunc</code>).</p> <h2>A Possible Solution</h2> <p>Where I commit the transaction, I could instead run something like <code>tx.Exec("SAVEPOINT my_savepoint")</code>, then <code>defer tx.Exec("ROLLBACK TO SAVEPOINT my_savepoint")</code></p> <p>After the code at Point B, I could run: <code>tx.Exec("RELEASE SAVEPOINT my_savepoint")</code></p> <p>So, if the code at Point B runs without error, I will fail to <code>ROLLBACK</code> to my savepoint. </p> <h2>Problems with Possible Solution</h2> <p>I'm not sure if using savepoints will mess with the database/sql package's behavior. Also, my solution seems a bit messy -- surely there is a cleaner way to do this!</p> </div>

service层配置事务问题

今天遇到个问题,利用spring将事务配置在了service层,在其中一个业务方法中需要2次调用同一个dao的delete方法,删除某个对象的时候是不一定成功的(有外键引用的话就不能删除),在删除多个对象的时候出现了问题,比如现在删除2个对象,第一个对象是可以删除的,可是第2个对象是删除不了的,这个时候我希望在第二个删除失败的时候,第一个对象也不要被删除,也就是说我想他们处在同一事务中,不知道怎么配置,以下是部分配置! <prop key="deletePricing">PROPAGATION_REQUIRED,-Exception</prop>、 请大家帮忙! 补充说明:在日志中发现,他是先删除一个对象,然后直接提交事务的!现在知道是这个原因,但是怎么改配置能让他们处于通一事务中呢? [b]问题补充:[/b] 问题是我现在dao层是没配置事务的啊,但就是第一个被删除了! 请问dao层如果不配置事务的话,那么默认他有没有事务呢? [b]问题补充:[/b] 配置文件中就是这样配置的 <prop key="deletePricing">PROPAGATION_REQUIRED,-Exception</prop>、 [b]问题补充:[/b] <bean id="myTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> </bean> <bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> <property name="transactionManager"> <ref bean="myTransactionManager" /> </property> <property name="transactionAttributes"> <props> <prop key="save">PROPAGATION_REQUIRED,+Exception</prop> <prop key="addPricing">PROPAGATION_REQUIRED,-Exception</prop> <prop key="deletePricing">PROPAGATION_REQUIRED,-Exception</prop> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>所有配置 [b]问题补充:[/b] <bean id="pricing" parent="transactionProxy"> <property name="target"> <ref bean="pricingService"/> </property> </bean> <bean id="pricingService" class="com.lilg.service.PricingServiceImpl"> <property name="dao"> <ref bean="PricingDAO"/> </property> </bean> [b]问题补充:[/b] public void delete(Pricing persistentInstance) { log.debug("deleting Pricing instance"); try { getHibernateTemplate().delete(persistentInstance); log.debug("delete successful"); } catch (RuntimeException re) { log.error("delete failed", re); throw re; } } 这个是dao代码,我不清楚你说的配置事务是说明意思? [b]问题补充:[/b] <prop key="deletePricing">PROPAGATION_REQUIRED,-Exception</prop> 这里算不算配置事务呢? [b]问题补充:[/b] 但是很奇怪,现在就是在删除的时候如果第一个删除ok第二个失败的话 第一个不会回滚,在看日志记录的时候发现他在删除第一个的时候开启了事务,然后删除结束后就提交了事务,不知道为什么了? 难道dao不配置默认也是有事务的? [b]问题补充:[/b] public void delete(Pricing persistentInstance) { log.debug("deleting Pricing instance"); try { getHibernateTemplate().delete(persistentInstance); log.debug("delete successful"); } catch (RuntimeException re) { log.error("delete failed", re); throw re; } } 这个就是dao代码! 谢谢帮忙 [b]问题补充:[/b] dao代码贴出来了 是没有事务的! [b]问题补充:[/b] 回复 constant 我也很奇怪,配置信息及dao代码都贴上来了就是比较郁闷。第一个总是本删除 我看了日志,在删除第一个的时候他打开事务的删除完毕之后就提交事务。 但是我的dao根本是没有配置事务的! 郁闷了 [b]问题补充:[/b] 各位好!我发现问题了! 本来应该是在service方法里调用2次dao里的delete方法,而代码是在action类里2次调用了service类的方法。 哎 还是不够细心的问题 ! 谢谢你的帮忙 !  谢谢大家的帮忙!

java的for循环中的事务问题

在service层做for循环,现在的需求是每一次循环后的数据库操作能生效,如果某一次循环出错只会回滚当前这次的数据库操作,之前循环的操作不回滚,不知道有没有办法做到这种事务控制?在action做循环调用service是可以实现这种要求,但是这样的话就会业务代码写到action上了,不是很合理

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

点沙成金:英特尔芯片制造全过程揭密

“亚马逊丛林里的蝴蝶扇动几下翅膀就可能引起两周后美国德州的一次飓风……” 这句人人皆知的话最初用来描述非线性系统中微小参数的变化所引起的系统极大变化。 而在更长的时间尺度内,我们所生活的这个世界就是这样一个异常复杂的非线性系统…… 水泥、穹顶、透视——关于时间与技艺的蝴蝶效应 公元前3000年,古埃及人将尼罗河中挖出的泥浆与纳特龙盐湖中的矿物盐混合,再掺入煅烧石灰石制成的石灰,由此得来了人...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你打算用Java 8一辈子都不打算升级到Java 14,真香

我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

一文带你入门Java Stream流,太强了

两个星期以前,就有读者强烈要求我写一篇 Java Stream 流的文章,我说市面上不是已经有很多了吗,结果你猜他怎么说:“就想看你写的啊!”你看你看,多么苍白的喜欢啊。那就“勉为其难”写一篇吧,嘻嘻。 单从“Stream”这个单词上来看,它似乎和 java.io 包下的 InputStream 和 OutputStream 有些关系。实际上呢,没毛关系。Java 8 新增的 Stream 是为...

立即提问
相关内容推荐