选择并删除事务sql中的记录

时间:2017-01-14 08:31:14

标签: sql oracle transactions

我使用oracle作为我的数据库服务器。我有一个简单的sql表,它存储每个成员的代码。我想从表中删除代码,但也得到它的值。

SQL> describe member_code_store;
 Name                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 MEMBER                    NOT NULL NUMBER(38)
 CODE                      NOT NULL VARCHAR2(30)

所以我想在事务中运行以下查询

PreparedStatement pstmt = null;
ResultSet rs = null;
String query =
        "SELECT code FROM member_code_store where coupon=? AND rownum=1";
Connection connection = DBConnection.getConnection();
pstmt = connection.prepareStatement(query);
pstmt.setString(1, String.valueOf(3));
rs = pstmt.executeQuery();
rs.next();
String code = rs.getString(1);

立即删除代码

String query =
        "delete from member_code_store where coupon =? AND code=?;";
Connection connection = DBConnection.getConnection();
pstmt = connection.prepareStatement(query);
pstmt.setString(1, String.valueOf(3));
pstmt.setString(2, code);
rs = pstmt.executeUpdate();

上述代码的问题是删除代码的多个工作人员将获得相同的代码。如何附上事务,以便我只是锁定记录而不是锁定整个表。

或者我应该使用效率更高的程序或程序包吗?

1 个答案:

答案 0 :(得分:0)

基本上你应该使用行锁。我展示的示例包括nowait选项,如果您尝试选择锁定行并且您的代码必须处理该行,则会返回错误。

select code, rowid 
from member_code_store
where coupon=? AND rownum=1
for update of code nowait

保存rowid,以便有一个变量提供给删除语句

delete from member_code_store
where rowid = :row_id