【DRP】【SQL】-悲观锁-防止多用户同时操作时出现脏数据

 1     /**
 2      * 根据表名生成该表的序列
 3      * @param tableName
 4      * @return 返回生成的序列
 5      */
 6     //全局方法 -加锁
 7     //public static synchronized int generate(String tableName) {   
 8     //局部成员方法-加锁
 9     //public synchronized int generate(String tableName) {
10         //synchronized(this) {
11     public static int generate(String tableName) {
12         //使用数据库的悲观锁for update
13         String sql = "select value from t_table_id where table_name=? for update";
14         Connection conn = null;
15         PreparedStatement pstmt = null;
16         ResultSet rs = null;
17         int value = 0;
18         try {
19             conn = DbUtil.getConnection();
20             //开始事务
21             DbUtil.beginTransaction(conn);
22             pstmt = conn.prepareStatement(sql);
23             pstmt.setString(1, tableName);
24             rs = pstmt.executeQuery();
25             if (!rs.next()) {
26                 throw new RuntimeException();
27             }
28             value = rs.getInt("value");
29             value++; //自加
30             modifyValueField(conn, tableName, value);
31             //提交事务
32             DbUtil.commitTransaction(conn);
33         }catch(Exception e) {
34             e.printStackTrace();
35             //回滚事务
36             DbUtil.rollbackTransaction(conn);
37             throw new RuntimeException();
38         }finally {
39             DbUtil.close(rs);
40             DbUtil.close(pstmt);
41             DbUtil.resetConnection(conn); //重置Connection的状态
42             DbUtil.close(conn);
43         }
44         return value;
45     }

总结:不断提高自己编程效率!

原文地址:https://www.cnblogs.com/yinweitao/p/5635646.html