我使用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();
上述代码的问题是删除代码的多个工作人员将获得相同的代码。如何附上事务,以便我只是锁定记录而不是锁定整个表。
或者我应该使用效率更高的程序或程序包吗?
答案 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